WHERE子句在子查询中给出不同的结果

时间:2018-03-26 16:45:06

标签: mysql sql syntax

专注于最后两行...

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产品相关的现有和活跃客户中选择所有重复下载的下载,并显示所有内容"

2 个答案:

答案 0 :(得分:2)

当您引用不在group by列表中的列时,MySQL将从组中的一个行返回随机选择的值。因此,在group by之前,在子查询之外,在group by之后过滤子查询是否很重要。在第二种情况下,具有匹配和不匹配行的组将被随机包含或排除。

答案 1 :(得分:0)

当你移动这样的where子句时,你会过滤不同的东西。在第一个查询中,您要过滤分组结果;在第二个中,您将筛选结果分组。最重要的是,在第一个中,您将过滤未分组的非聚合字段;许多类型的SQL和MySQL的当前默认配置甚至不允许这样的(子)查询。第一个查询基本上是根据分组的每个id_product, id_customer组合的值对随机选择的值进行过滤。