mysql group by with where返回完全其他结果

时间:2017-08-26 11:28:55

标签: mysql one-to-many children records

我尝试在一对多关系子项中选择子项记录为1.对于使用一条记录获取子项,我使用以下查询。

如果我不使用where语句

,这是一个简单的查询
select a.iid, 
account_id,
count(*) as props

from  accounts_prop a
group by a.account_id
having props = 1

当我使用where时,我完全得到了其他结果。在这种情况下,我得到的记录显示道具有1条记录但实际上有多条

    select a.iid, 
    account_id,
    count(*) as props

    from   accounts_prop a
    where a.von >= '2017-08-25'
    group by a.account_id

having props = 1

在这种情况下我缺少的是

2 个答案:

答案 0 :(得分:1)

where条件过滤原始行

 where a.von >= '2017-08-25'

减少查询中涉及的行数

having子句处理查询的结果,所以在你有过滤器的地方(或不是)你得到不同的结果
在第一个查询的情况下,您的计数是在第二个查询中的所有行上计算的,您的计数仅在子集上计算

这可以解释为什么从两个查询中获得不同的结果

答案 1 :(得分:0)

仔细检查后,您的原始查询甚至无法确定:

SELECT
    a.iid,              -- OK, but which value of iid do we choose?
    a.account_id,
    COUNT(*) AS props
FROM accounts_prop a
GROUP BY a.account_id
HAVING props = 1

查询没有意义,因为您在聚合其他列时选择了iid列。 应为每个帐户选择iid值?这一点尚不清楚,您的查询甚至不会在某些版本的MySQL或大多数其他数据库上运行。

相反,将您的逻辑用于查找只有一条记录到子查询中的帐户,然后加入该子查询以获取每个匹配的完整记录:

SELECT a1.*
FROM accounts_prop a1
INNER JOIN
(
    SELECT account_id
    FROM accounts_prop
    GROUP BY account_id
    HAVING COUNT(*) = 1
) a2
    ON a1.account_id = a2.account_id
WHERE a1.von >= '2017-08-25'