2010-09-15 4 views
4

Je ne sais pas pourquoi je ne peux pas faire fonctionner cette requête comme je le souhaite, j'espère que vous pouvez m'éclairer.La requête GROUP BY ne se passe pas comme prévu

SELECT e.id, 
      e.num, 
      e.name, 
      s.name as s_name, 
      t.num as t_num, 
      e.show_id 
    FROM s_episodes e 
LEFT JOIN shows s ON s.id = e.show_id 
LEFT JOIN s_seasons t ON t.id = e.season_id 
GROUP BY e.show_id 
ORDER BY e.dateadded DESC 

dateadded est un int (délai d'attente unix). e.num, t.num sont aussi int. Il est supposé montrer les derniers épisodes ajoutés, mais quand les GROUP BY groupent les rangées, les épisodes listés ne sont pas les plus récents mais le premier épisode (numéro d'épisode indiqué par e.num) de la dernière saison (numéro de saison indiqué par t_num) d'un spectacle (cependant, les spectacles sont classés par date selon les derniers épisodes, mais l'épisode répertorié est le premier de la saison, pas le dernier ajouté).

Des idées?

J'espère que je me suis fait clair, désolé pour les erreurs en anglais. Merci.

+4

fou mysql !, cette déclaration devrait jeter une erreur au sujet * e.id, e.num, e.name, s.name, * et * t.num * ne faisant pas partie du groupe par ou une fonction aggergate. –

+0

Je ne comprends pas pourquoi vous voulez la clause 'GROUP BY' - [mysql permet au groupe d'omettre les colonnes] (http://dev.mysql.com/doc/refman/5.0/fr/group-by-hidden -columns.html). Voulez-vous seulement voir la liste des derniers épisodes ajoutés par spectacle? –

+0

aidez-moi avec la logique: chaque saison a x épisodes ... alors quel est l'élément de spectacle? ....... 2. gauche rejoindre, gauche rejoindre - se sent comme perdre quelque chose ... alors encore une fois je dois comprendre ce que je veux après – Asaf

Répondre

3

Lorsque vous groupez par par un champ et le champ résultant ne fait pas partie de celui-ci (ou dans votre cas l'ordre par champ) le résultat est imprévisible.

Vous devez soit ajouter à un groupe par ou dans votre cas, utilisez la fonction globale:

ORDER BY MAX(e.dateadded) DESC 

EDIT: avez-vous vraiment besoin des LEFT JOIN s ou ceux qui pourraient aswell être joint régulière intérieure ?

Puisque vous avez besoin aussi d'afficher les champs de dernier épisode, vous pouvez essayer:

SELECT e.id, 
      e.num, 
      e.name, 
      s.name as s_name, 
      t.num as t_num, 
      e.show_id 
    FROM shows s 
    JOIN s_episodes e ON e.id = 
       (SELECT id 
       FROM s_episodes 
       WHERE show_id = s.id 
       ORDER BY dateadded DESC LIMIT 1) 
LEFT JOIN s_seasons t ON t.id = e.season_id 
ORDER BY e.dateadded DESC 
+2

+1. Pour accélérer la requête, il serait bon de créer un index sur 's_episodes (show_id, dateadded, id)' et de changer la clause de commande de sous-requête en 'ORDER BY show_id DESC, dateadded DESC, id DESC'. Cela peut sembler redondant, mais MySQL doit utiliser l'index correct. – Quassnoi

+0

Cette requête a fonctionné.C'est un peu lent, mais ça marche. Merci. – Tomas

+0

@Quassnoi: Merci. C'est très clerver –

0

vous devez d'abord déterminer l'épisode le plus récent ajouté pour l'émission donnée. Ensuite, vous pouvez ajouter le reste des données.

SELECT a.dateadded, 
     e.id, 
      e.num, 
      e.name, 
      s.name as s_name, 
      t.num as t_num, 
      e.show_id 

from   
(select max(dateadded) maxdate, show_id 
    FROM s_episodes 
    group by show_id)a 
inner join s_episodes e 
     on e.show_id = a.show_id 
     and e.dateadded = a.maxdate 
LEFT JOIN shows s ON s.id = e.show_id 
LEFT JOIN s_seasons t ON t.id = e.season_id 
Questions connexes