2012-03-01 4 views
0

J'ai 2 tables que je dois obtenir les 10 derniers identifiants de projet actifs basés sur la date. La requête est:Groupe MySQL par après l'union # 1064 erreur

(
SELECT project_posts.projectid as projectId, `project_posts`.`date` as rowDate 
FROM `project_posts` ORDER BY `project_posts`.id DESC 
) 
UNION ALL 
(SELECT `project_comments`.projectid as projectId, project_comments.`date` as rowDate FROM `project_comments` ORDER BY `project_comments`.id DESC) GROUP BY projectId ORDER BY rowDate DESC LIMIT 10 

Et je veux trier par rowDate DESC (dernier projet d'abord). Le problème est que quand j'ajouter un groupe par MySQL dit:

 
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use 
near 'GROUP BY projectId ORDER BY rowDate DESC LIMIT 6' at line 9 

j'ai regardé sur Internet pour des problèmes avec l'union, l'union et tout groupe par, mais je ne trouve pas de solution. Merci d'avance.

Répondre

4

Je pense que vous devez créer une table dérivée de votre requête syndicale avant de pouvoir groupe sur elle -

SELECT projectId, MAX(rowDate) AS rowDate 
FROM (
    (
     SELECT project_posts.projectid as projectId, `project_posts`.`date` as rowDate 
     FROM `project_posts` 
    ) UNION ALL (
     SELECT `project_comments`.projectid as projectId, project_comments.`date` as rowDate 
     FROM `project_comments` 
    ) 
) AS tmp 
GROUP BY projectId 
ORDER BY rowDate DESC 
LIMIT 10 

Je n'ai pas eu la chance d'essayer cela, mais il faut faire ce que vous êtes après -

SELECT p.id, GREATEST(IFNULL(MAX(pc.date), 0), IFNULL(MAX(pp.date), 0)) AS max_date 
FROM projects p 
LEFT JOIN project_comments pc 
    ON p.id = pc.projectid 
LEFT JOIN project_posts pp 
    ON p.id = pp.projectid 
GROUP BY p.id 
ORDER BY max_date DESC 
LIMIT 10 

MISE à JOUR L'UNION requête basée devrait être nettement plus rapide que cette seconde requête. J'ai fait quelques tests grossiers en utilisant des données factices (projets 100k, 200k messages et 700k commentaires) et la requête multi-joint prend trois à cinq fois plus de temps que la requête UNION.

+0

Merci beaucoup pour la réponse rapide. Maintenant, la requête s'exécute, mais le tri n'est pas correct, il ne prend pas les identifiants du projet LAST (ils sont différents quand j'exécute des sélections séparées pour les deux talbes ordonnées par la date DESC). J'ai essayé de changer la clause ORDER BY dans chaque select (dans l'UNION) avec ORDER BY 'project_comments'.'date' DESC et' project_posts'.'date' DESC, mais c'est toujours là. Toute suggestion? Merci d'avance. – some12die4

+0

Je viens de lire à nouveau votre message original. Quel est exactement le but final et quelles sont les structures de la table? Je ne pense pas que cette requête avec UNION soit la meilleure façon de le faire. – nnichols

+0

Désolé pour le malentendu. Je veux obtenir les 10 derniers projets actifs en fonction de l'activité en eux (messages et commentaires). Je n'ai pas trouvé de manière différente de l'union. – some12die4