【发布时间】:2018-03-26 16:45:05
【问题描述】:
关注最后两行...
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'
and(移动到子查询中)
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 产品的下载”
第二个类似“从现有的和活跃的客户中选择所有与 Antescofo 产品相关并在 2015 年制作的重复数据下载,并显示所有内容”。
【问题讨论】:
-
问题:为什么要在这两种情况下都使用子查询?似乎您正在增加复杂性而没有任何好处。如果 group by 中包含的行的 date_download 列具有不同的值,则分组行中的值会有所不同,并且可能不是您所期望的。
-
补充一下@SloanThrasher 所说的,您对 LEFT JOIN 的使用也有点毫无意义,
WHERE pc.active = 1将其变成了 INNER JOIN。