MySQL Left Outer Join&伯爵 - '哪里'?

时间:2018-03-12 12:40:33

标签: mysql

我有一个相对简单的查询,它返回一个用户个人资料,以及与该用户相关的2个计数(流事件和库存);

WHERE u.username='sampleuser' AND s.fmid=u.fmid AND i.fmid=u.fmid
GROUP BY u.fmid

库存和库存流值可以为零,因此使用左外连接。

但是,当前两个值都返回所有用户的数字,而不是特定用户(在每个表中始终标识为整数'fmid')。这显然是因为查询没有指定任何计数的“where” - 但我不确定在哪里。如果我将最后一部分改为此;

{{1}}

它仍会返回错误的数字,尽管“不同的”数字取决于搜索条件 - 以及invcount和streamcount的名称编号。

2 个答案:

答案 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。

See longer explanation