2010-11-03 3 views
1

У меня есть два запроса. Первый возвращает некоторые результаты, а второй ничего не возвращает. Вот они.Два запроса, которые должны быть эквивалентными, возвращают разные результаты

Это один возвращает некоторые результаты:

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 

Это ничего не возвращает:

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 

Я полностью обмануты. Есть идеи?

Моя СУБД - это MySQL.

+0

Я бы порекомендовал вам 'SET sql_mode = 'ONLY_FULL_GROUP_BY'' до тех пор, пока вам не понравится, как работает GROUP BY. – Quassnoi

ответ

2

Второй запрос злоупотребляет MySQL расширением до GROUP BY, что позволяет выбирать неагрегированные столбцы.

import_id выбран из случайной записи для каждой группы во втором запросе, и не гарантируется, что она будет 188. Но запрос проверяет его после GROUP BY.

Образца данные:

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

Первого запрос:

SELECT grouper, value 
FROM mytable 
WHERE value = 1 

grouper value 
1   1 
1   1 
2   1 

Поскольку WHERE выполняется перед GROUP BY, этим запрос будет рассматривать только те записи, удерживающие value = 1 (которые были возвращены на предыдущем этапе):

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

grouper COUNT(*) 
1   2 
2   1 

Второй q uery:

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

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

Поскольку value не группируются и не суммируются, он может быть взят из любой запись в группе! В этом случае это было взято из последних записей или соответствующих групп (но их можно было взять и из других записей).

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

-- no rows 

Поскольку не было никаких записей с value = 1 на предыдущем этапе (это произошло так, что значения были взяты из других записей), запись не удовлетворяет условию WHERE.

Смежные вопросы