[英]MySQL JOINED table query should return zero but instead does not return those rows
SELECT sg.date, sg.groupName, sg.highlights,
user.display_name as displayName,
COUNT(uc.groupName) as cmtcnt
FROM `saved_groups` as sg
LEFT JOIN `user` on user.email = sg.userName
LEFT JOIN `user_comments` as uc on sg.groupName = uc.groupName
WHERE uc.deleted=0
GROUP BY sg.groupName
我有兩個表, saved_groups
和user_comments
,查詢的第二行應該(確實有效)返回一個額外的列,其中包含與每個組關聯的評論數。
但是,當一個組的評論為零時,根本不會返回該組。 返回的唯一行是評論> 0
的行。 期望的行為是返回所有 groupNames,並為 uc 表中關聯注釋為零的那些行指定 0。
如何修復此查詢?
我試過: IF(uc.deleted=1, 0, COUNT(uc.groupName)) as cmtcnt
- 但這沒有區別,返回相同的結果。
在這一點上,我不確定接下來要嘗試什么。
建議?
你想要所有的記錄? 然后刪除WHERE
子句。 您想要0
用於沒有計數的記錄嗎? 使用COALESCE
。 像這樣:
SELECT sg.date
, sg.groupName
, sg.highlights
, user.display_name as displayName
, COALESCE(COUNT(uc.groupName), 0) as cmtcnt
FROM `saved_groups` as sg
LEFT JOIN `user` on user.email = sg.userName
LEFT JOIN `user_comments` as uc on sg.groupName = uc.groupName
AND uc.deleted = 1 -- to get only deleted comments, and not the others
GROUP BY sg.groupName
您的 where 條件是過濾記錄並僅返回那些在uc
中有數據的記錄,因此左連接沒有好處。 您可以執行( uc.deleted=0 or uc.deleted is null)
或將條件 uc.deleted 與加入條件一起移動
在您的代碼中添加 isnull(uc.deleted,0)=0 並將 LEFT JOIN 更改為用戶注釋的內連接。 uc.deleted=0 條件會導致對兩個表進行表掃描,相當於內部連接。 如果您正在尋找 uc.deleted ,請使用左連接是 null。 用戶評論加入是問題。 用戶也可以內聯,因為它與用戶評論鏈接在一起
SELECT sg.date, sg.groupName, sg.highlights,
user.display_name as displayName,
COUNT(uc.groupName) as cmtcnt
FROM dbo.saved_groups as sg
JOIN dbo.user on user.email = sg.userName
JOIN dbo.user_comments as uc on sg.groupName = uc.groupName
WHERE isnull(uc.deleted,0) in (0,1)
GROUP BY sg.groupName
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.