mysql - 应该等效的两个查询返回不同的结果

标签 mysql database sql

我有两个问题。第一个返回一些结果,第二个不返回任何结果。他们在这里。

这个返回一些结果:

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

由于 WHEREGROUP 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/

相关文章:

带有 COUNT 的 MySQL 运行总计

mysql - 如果不是 View ,如何在sql表中查看公式

mysql - 没有回调的nodejs mysql

database - 如何在 Neo4j 中删除/创建数据库?

sql - SQL Server中如何创建数据库的别名

sql - 如何获得组的一列的所有值的或乘积

mysql - 仅获取满足所有必需类型的行

mysql - 导出或创建数据库,哪个更快?

SQL删除孤儿

SQL Server 2008。仅当前一个不同时才重复排序