[英]MySQL Left Outer Join & Count - 'Where'?
我有一個相對簡單的查詢,返回一個用戶配置文件,以及與該用戶相關的2個計數(流事件和庫存);
SELECT u.*, r.regionName, COUNT(i.fmid) AS invcount, COUNT(s.fmid) AS streamcount
FROM fm_users u
JOIN fm_regions r
ON u.region=r.regionid
LEFT OUTER JOIN fm_inventory i
ON u.fmid=i.fmid
LEFT OUTER JOIN fm_stream s
ON u.fmid=s.fmid
WHERE u.username='sampleuser'
庫存和流值都可以為零,因此使用左外部聯接。
但是,這兩個值當前都返回所有用戶的數字,而不是特定用戶的數字(在每個表中始終標識為整數“ fmid”)。 這顯然是因為查詢沒有為任何一個計數指定“哪里”-但是我不確定在哪里。 如果我將最后一部分更改為此;
WHERE u.username='sampleuser' AND s.fmid=u.fmid AND i.fmid=u.fmid
GROUP BY u.fmid
它仍然返回錯誤的數字,盡管“不同”的數字取決於搜索條件-以及invcount和streamcount的名稱數字。
您的查詢交叉連接每個用戶的fm_inventory和fm_stream表。 例如,如果特定用戶有2個匹配的fm_inventory行,而fm_stream也有2行,則結果將有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子句,但其他語法相同。
當您將普通列與聚合混合時,請在GROUP BY中包括所有普通列。 在這種情況下,您在GROUP BY中缺少r.regionName。
詳見解釋 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.