专注于最后两行...
SELECT *
FROM
(SELECT d.*
FROM downloads AS d
LEFT JOIN ps_customer AS pc ON d.id_customer=pc.id_customer
WHERE pc.active=1
AND d.id_customer IS NOT NULL
GROUP BY id_product,
id_customer) AS tmp
WHERE YEAR(tmp.date_download)=2015
AND tmp.name='Antescofo'
和(在子查询中移动)
SELECT *
FROM
(SELECT d.*
FROM downloads AS d
LEFT JOIN ps_customer AS pc ON d.id_customer=pc.id_customer
WHERE pc.active=1
AND d.id_customer IS NOT NULL
AND YEAR(d.date_download)=2015
AND d.name='Antescofo'
GROUP BY id_product,
id_customer) AS tmp
...给出不同的行数结果。
我试图理解原因,因为WHERE子句在某种程度上充当了过滤器。
在子查询中或之后过滤有什么区别?
根据我的理解,第一个就像"从现有和活跃客户中选择所有重复下载的下载,并仅显示2015年制作的Antescofo产品的下载"
第二个类似于"从2015年制作的与Antescofo产品相关的现有和活跃客户中选择所有重复下载的下载,并显示所有内容" 。
答案 0 :(得分:2)
当您引用不在group by
列表中的列时,MySQL将从组中的一个行返回随机选择的值。因此,在group by
之前,在子查询之外,在group by
之后过滤子查询是否很重要。在第二种情况下,具有匹配和不匹配行的组将被随机包含或排除。
答案 1 :(得分:0)
当你移动这样的where子句时,你会过滤不同的东西。在第一个查询中,您要过滤分组结果;在第二个中,您将筛选结果分组。最重要的是,在第一个中,您将过滤未分组的非聚合字段;许多类型的SQL和MySQL的当前默认配置甚至不允许这样的(子)查询。第一个查询基本上是根据分组的每个id_product, id_customer
组合的值对随机选择的值进行过滤。