2017-08-26 76 views
0

我尝试在childs的记录为1的一对多关系child中进行选择。对于用一个记录获取childs,我使用以下查询。mysql group by with where返回其他结果

下面是一个简单的查询,如果我不使用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 

我错过了在这种情况下

+0

这两个查询是不同的第一个涉及所有行第二个只有行与a.von> ='2017-08-25'那么你有不同的行组集..你的问题是不是清..试试解释更好 – scaisEdge

回答

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' 
+0

非常感谢详细的解释! – fefe

1

WHERE条件过滤器,你原来的行所以

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

减少参与查询的行数

上查询的结果having子句工作,让你有一个地方过滤器(或无T)你获得不同的结果
在您的计数在所有行计算的第一个查询您的情况您的第二个查询的数量仅在一个子集

计算这可以解释为什么你获得不同resul这两个查询