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

Mysql WHERE子句在子查询与否中给出不同的结果,mysql,sql,syntax,Mysql,Sql,Syntax,关注最后两行 挑选* 从…起 选择d* 从下载中作为d 左连接ps_客户作为d.id_客户上的pc=pc.id_客户 其中pc.active=1 d.id\u客户不为空 按id_产品分组, id_客户作为tmp 其中YEARtmp.date_download=2015 和tmp.name='Antescofo' 并移动到子查询中 挑选* 从…起 选择d* 从下载中作为d 左连接ps_客户作为d.id_客户上的pc=pc.id_客户 其中pc.active=1 d.id\u客户不为空 年份d.下载

关注最后两行

挑选* 从…起 选择d* 从下载中作为d 左连接ps_客户作为d.id_客户上的pc=pc.id_客户 其中pc.active=1 d.id\u客户不为空 按id_产品分组, id_客户作为tmp 其中YEARtmp.date_download=2015 和tmp.name='Antescofo' 并移动到子查询中

挑选* 从…起 选择d* 从下载中作为d 左连接ps_客户作为d.id_客户上的pc=pc.id_客户 其中pc.active=1 d.id\u客户不为空 年份d.下载日期=2015年 和d.name='Antescofo' 按id_产品分组, id_客户作为tmp 。。。给出不同的行计数结果

我试图理解为什么,因为WHERE子句在某种程度上起着过滤器的作用

在子查询中或之后进行筛选有什么区别

据我所知,第一个类似于选择现有和活动客户的所有重复数据消除下载,并仅显示2015年生产的Antescofo产品的下载


第二个选项,如从现有和活跃客户处选择所有重复数据消除下载,这些客户涉及Antescofo产品并于2015年生产,并显示所有内容。

当您移动这样的where子句时,您会过滤不同的内容。在第一个查询中,您正在筛选分组结果;在第二个示例中,您将对筛选结果进行分组。最重要的是,在第一个示例中,您对一个未分组、未聚合的字段进行过滤;许多风格的SQL和MySQL当前的默认配置甚至不允许这样的子查询。第一个查询基本上是从每个id\u产品、id\u客户组合分组的值中筛选随机选择的值。

当您移动这样的where子句时,您正在筛选不同的内容。在第一个查询中,您正在筛选分组结果;在第二个示例中,您将对筛选结果进行分组。最重要的是,在第一个示例中,您对一个未分组、未聚合的字段进行过滤;许多风格的SQL和MySQL当前的默认配置甚至不允许这样的子查询。第一个查询基本上是从分组的每个id\u产品、id\u客户组合的值中筛选随机选择的值。

当您引用不在group by列表中的列时,MySQL将从组中的一行返回随机选择的值。因此,无论是在子查询内部、分组依据之前,还是在子查询外部、分组依据之后进行筛选,都很重要。在第二种情况下,具有匹配行和不匹配行的组将被随机包括或排除。

当您引用不在group by列表中的列时,MySQL将从组中的一行返回随机选择的值。因此,无论是在子查询内部、分组依据之前,还是在子查询外部、分组依据之后进行筛选,都很重要。在第二种情况下,具有匹配行和不匹配行的组将被随机包括或排除。

问题:在这两种情况下,为什么要麻烦使用子查询?似乎你在增加复杂性,但没有任何好处。如果group by中包含的行在date_download列中具有不同的值,则分组行中的值将有所不同,并且可能不是您期望的值。要补充@Sloarthasher所说的内容,您使用LEFT JOIN也有点毫无意义,WHERE pc.active=1将其转换为内部联接。问题:在这两种情况下,为什么要麻烦使用子查询?似乎你在增加复杂性,但没有任何好处。如果group by中包含的行在date_download列中具有不同的值,则分组行中的值将有所不同,并且可能不是您期望的值。要补充@Sloarthasher所说的内容,使用LEFT JOIN也有点无意义,WHERE pc.active=1将其转换为内部联接。