我尝试在一对多关系子项中选择子项记录为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
在这种情况下我缺少的是
答案 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'