我有一个相对简单的查询,它返回一个用户个人资料,以及与该用户相关的2个计数(流事件和库存);
WHERE u.username='sampleuser' AND s.fmid=u.fmid AND i.fmid=u.fmid
GROUP BY u.fmid
库存和库存流值可以为零,因此使用左外连接。
但是,当前两个值都返回所有用户的数字,而不是特定用户(在每个表中始终标识为整数'fmid')。这显然是因为查询没有指定任何计数的“where” - 但我不确定在哪里。如果我将最后一部分改为此;
{{1}}
它仍会返回错误的数字,尽管“不同的”数字取决于搜索条件 - 以及invcount和streamcount的名称编号。
答案 0 :(得分:1)
您的查询交叉连接每个用户的fm_inventory和fm_stream表。例如,如果特定用户具有2个匹配的fm_inventory行,并且fm_stream也有两个,则结果将具有4(= 2 x 2)行,并且每个行将在两个COUNT()函数中计数。
完成工作的方法是对计数使用相关的子选择。
SELECT u.*, r.regionName,
(select COUNT(*) from fm_inventory i
where i.fmid = u.fmid) AS invcount,
(select COUNT(*) from fm_stream s
where s.fmid = u.fmid) AS streamcount
FROM fm_users u
JOIN fm_regions r
ON u.region=r.regionid
WHERE u.username='sampleuser'
这允许计数彼此独立。即使选择了不止一个用户,这也有效。在这种情况下,您需要group by子句,否则它的语法相同。
答案 1 :(得分:0)
将普通列与聚合混合时,请包括GROUP BY中的所有常规列。在这种特殊情况下,您缺少GROUP BY中的r.regionName。