2010-11-03 6 views
1

J'ai deux requêtes. Le premier renvoie des résultats et le second ne renvoie rien. Les voici.Deux requêtes qui doivent être équivalentes retournent des résultats différents

Celui-ci retourne des résultats:

select md5(concat(ad.line1, ad.line2, ad.city, s.name, ad.zip, group_concat(distinct c.name))) id, 
     group_concat(distinct c.name) customer_names, 
     count(distinct c.name) number_of_customers, 
     ad.line1, 
     ad.line2, 
     ad.city, 
     s.name state_name, 
     ad.zip, 
     a.import_id 
    from address ad 
    join account_address aa on aa.address_id = ad.id 
    join account a on aa.account_id = a.id 
    join import i on a.import_id = i.id 
    join customer c on a.customer_id = c.id 
    join state s on ad.state_id = s.id 
where a.import_id = 188 
group by s.name, city, zip, line1, line2 

ne voyez rien:

select * from 
(select md5(concat(ad.line1, ad.line2, ad.city, s.name, ad.zip, group_concat(distinct c.name))) id, 
     group_concat(distinct c.name) customer_names, 
     count(distinct c.name) number_of_customers, 
     ad.line1, 
     ad.line2, 
     ad.city, 
     s.name state_name, 
     ad.zip, 
     a.import_id 
    from address ad 
    join account_address aa on aa.address_id = ad.id 
    join account a on aa.account_id = a.id 
    join import i on a.import_id = i.id 
    join customer c on a.customer_id = c.id 
    join state s on ad.state_id = s.id 
group by s.name, city, zip, line1, line2) v 
where v.import_id = 188 

Je suis complètement embobiner. Des idées?

Mon SGBD est MySQL.

+0

Je vous recommande de 'SET sql_mode = 'ONLY_FULL_GROUP_BY'' jusqu'à ce que vous soyez à l'aise avec le fonctionnement de' GROUP BY'. – Quassnoi

Répondre

2

La deuxième requête abuse de MySQL extension à GROUP BY qui permet de sélectionner des colonnes non agrégées.

import_id est sélectionné à partir d'un enregistrement aléatoire par groupe dans la deuxième requête, et il n'est pas garanti qu'il sera 188. Mais la requête vérifie après le GROUP BY.

données de l'échantillon:

grouper value 
1   1 
1   1 
1   2 
1   3 
2   1 
2   2 
2   3 

première requête:

SELECT grouper, value 
FROM mytable 
WHERE value = 1 

grouper value 
1   1 
1   1 
2   1 

Depuis WHERE est exécutée avant GROUP BY, cette requête ne prendra en considération les dossiers tenant value = 1 (qui ont été retournés à l'étape précédente):

SELECT grouper, COUNT(*) 
FROM  mytable 
WHERE value = 1 
GROUP BY 
     grouper 

grouper COUNT(*) 
1   2 
2   1 

Deuxième q uery:

SELECT grouper, COUNT(*), value 
FROM  mytable 
GROUP BY 
     grouper 

grouper COUNT(*) value 
1   4   2 
2   3   3 

Depuis value est et non pas groupées agrégées, il peut être pris à partir tout enregistrement au sein du groupe! Dans ce cas, cela a été pris à partir des derniers enregistrements ou des groupes appropriés (mais pourrait aussi être pris à partir d'autres enregistrements).

SELECT * 
FROM  (
     SELECT grouper, COUNT(*), value 
     FROM  mytable 
     GROUP BY 
        grouper 
     ) q 
WHERE value = 1 

-- no rows 

Comme il n'y avait pas d'enregistrement avec value = 1 sur la scène précédente (il est arrivé pour que les valeurs ont été prises à partir des autres dossiers), aucun enregistrement satisfait la condition WHERE.

Questions connexes