我有两个问题。第一个返回一些结果,第二个不返回任何结果。他们在这里。
这个返回一些结果:
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。
最佳答案
第二个查询滥用 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
第二个查询:
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
条件。
关于mysql - 应该等效的两个查询返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090569/