簡體   English   中英

MySQL左外部聯接和計數-“哪里”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM