2010-07-14 5 views
0

J'ai un problème avec une instruction SQL: En utilisant cetteMySQL: Problème avec max() et le groupe de - mauvaises valeurs

select a.id as ID, a.dur as DUR, DATE(FROM_UNIXTIME(timestampCol)) as date, 
a_au.re as RE, a_au.stat as STAT from b_c 
    inner join c on b_c.c_id = c.id 
    inner join a on c.id = a.c_id 
    inner join a_au on a.id = a_au.id 
    inner join revi on a_au.rev = revi.rev 
    where b_c.b_id = 5 

-je obtenir ce résultat:

ID DUR   date RE STAT 
------------------------------- 
31, 10, '2010-07-14', 2200, 0 
31, 10, '2010-07-14', 2205, 0 
31, 10, '2010-07-14', 2206, 2 
31, 10, '2010-07-14', 2207, 0 
31, 10, '2010-07-14', 2210, 2 
31, 10, '2010-07-15', 2211, 0 
31, 10, '2010-07-14', 2213, 1 
32, 10, '2010-07-14', 2203, 0 
32, 10, '2010-07-14', 2204, 0 
32, 10, '2010-07-14', 2208, 2 
32, 10, '2010-07-14', 2209, 0 
32, 10, '2010-07-15', 2212, 2 

Maintenant, je veux pour obtenir une ligne de résultat pour une combinaison ID et date. Aussi, je veux obtenir cette ligne de résultat avec le numéro RE le plus élevé.

Alors j'écris ma déclaration:

select a.id as ID, a.dur as DUR, DATE(FROM_UNIXTIME(timestampCol)) as date, 
max(a_au.re) as RE, a_au.stat as STAT from b_c 
    inner join c on b_c.c_id = c.id 
    inner join a on c.id = a.c_id 
    inner join a_au on a.id = a_au.id 
    inner join revi on a_au.rev = revi.rev 
    where b_c.b_id = 5 
    group by ID, date 

Maintenant, j'obtenir ce résultat:

ID DUR   date RE STAT 
------------------------------- 
31, 10, '2010-07-14', 2213, 0 
31, 10, '2010-07-15', 2211, 0 
32, 10, '2010-07-14', 2209, 0 
32, 10, '2010-07-15', 2212, 2 

Tout semble bien se passer, j'ai une ligne de résultat par jour/combinaison d'identité et la ligne avec le numéro RE le plus élevé. Mais: la colonne STAT n'a pas les valeurs correctes! La ligne

31, 10, '2010-07-14', 2213, 0 

doit avoir le statut 1:

31, 10, '2010-07-14', 2213, 1 

Donc, il doit y avoir une erreur dans ma déclaration. Il semble que MySQL prenne la première valeur de colonne STAT trouvée. Mais je veux avoir le correspondant.

Que dois-je faire? J'ai vu d'autres sujets à ce sujet comme ici: Selecting all corresponding fields using MAX and GROUP BY mais je ne peux pas le transférer à mon instruction SQL.

Merci beaucoup d'avance & Cordialement.

+0

Ajout de la balise 'most-n-per-group'. Cliquez sur cette étiquette pour voir des dizaines d'autres messages avec des problèmes similaires. –

Répondre

1

Utilisation:

SELECT a.id as ID, 
     a.dur as DUR, 
     DATE(FROM_UNIXTIME(timestampCol)) as date, 
     a_au.re as RE, 
     a_au.stat as STAT 
FROM b_c 
JOIN c on b_c.c_id = c.id 
JOIN a on c.id = a.c_id 
JOIN a_au on a.id = a_au.id 
JOIN revi on a_au.rev = revi.rev 
JOIN (SELECT a.id as ID, 
       DATE(FROM_UNIXTIME(timestampCol)) as date, 
       MAX(a_au.re) as Max_RE 
      FROM b_c 
      JOIN c on b_c.c_id = c.id 
      JOIN a on c.id = a.c_id 
      JOIN a_au on a.id = a_au.id 
      JOIN revi on a_au.rev = revi.rev 
     WHERE b_c.b_id = 5 
     GROUP BY a.id, DATE(FROM_UNIXTIME(timestampCol))) x ON x.id = a.id 
                 AND x.date = DATE(FROM_UNIXTIME(timestampCol)) 
                 AND x.max_re = a_au.re 
WHERE b_c.b_id = 5 

Malheureusement, MySQL ne supporte pas la clause WITH qui aurait pu fait cela beaucoup plus facile à lire.

+0

J'ai utilisé votre instruction SQL (je pense que ce doit être x.Max_Re = a_au.re au lieu de x.max_re = a_au.re). Mais maintenant je reçois deux lignes avec ces données: 31, 10, '2010-07-14', 2213, 1 31, 10, '2010-07-14', 2213, 1 Donc, je reçois le STAT 1 pour ID 31 et REV 2213, mais les autres lignes sont manquantes et cette ligne est là deux fois. – Tim

+0

sans "x sur x.id ...": 31, 10, '2010-07-14', 2200, 0 31, 10, '2010-07-14', 2205, 0 31, 10, '2010-07-14', 2206, 2 31, 10, '2010-07-14', 2207, 0 31, 10, '2010-07-14', 2210, 2 31, 10, '2010-07-15', 2211, 0 31 , 10, '2010-07-14', 2213, 1 31, 10, '2010-07-14', 2200, 0 31, 10, '2010-07-14', 2205, 0 31, 10 , '2010-07-14', 2206, 2 31, 10, '2010-07-14', 2207, 0 31, 10, '2010-07-14', 2210, 2 31, 10, ' 2010-07-15 ', 2211, 0 31, 10,' 2010-07-14 ', 2213, 1 32, 10,' 2010-07-14 ', 2203, 0 32, 10,' 2010- 07-14 ', 2204, 0 32, 10, '2010-07-14', 2208, 2 32, 10, '2010-07-14', 2209, 0 32, 10, '2010-07-15', 2212, 2 – Tim

+0

Ajouter 'group by 1, 2' à la sous-requête' x'. – ceteras

Questions connexes