未經測試:
將活動限制移到了連接上。
此外,還是帶來了超過你想要的,通過移動where子句圍繞該問題也應該解決。
標準的方法:
SELECT p1.`id` AS projectid
, count(a1.`id`) AS activitiescount
, a1.`userid` AS userid
, p1.`orgid` AS orgid
FROM `projects` AS p1
LEFT JOIN `activities` AS a1
ON p1.`id`=a1.`projectid`
AND a1.`userid` = 26
AND a1.`active`=1
WHERE p1.`orgid`=3
GROUP BY p1.`id`
ORDER BY p1.`name` DESC
你的方法W /()的正確放置。
SELECT
p1.`id` AS projectid
,count(a1.`id`) AS activitiescount
,a1.`userid` AS userid
,p1.`orgid` AS orgid
FROM `projects` AS p1
LEFT JOIN `activities` AS a1 ON p1.`id`=a1.`projectid`
WHERE p1.`orgid`=3
AND ((a1.`userid` = 26 AND a1.`active`=1) OR a1.`id` IS null)
GROUP BY p1.`id`
ORDER BY p1.`name` DESC
----更新以模擬每條評論的完整外連接。
SELECT *
FROM (
SELECT p1.`id` AS projectid
, count(a1.`id`) AS activitiescount
, a1.`userid` AS userid
, p1.`orgid` AS orgid
FROM `projects` AS p1
LEFT JOIN `activities` AS a1
ON p1.`id`=a1.`projectid`
AND a1.`userid` = 26
AND a1.`active`=1
WHERE p1.`orgid`=3
GROUP BY p1.`id`
UNION
SELECT p1.`id` AS projectid
, count(a1.`id`) AS activitiescount
, a1.`userid` AS userid
, p1.`orgid` AS orgid
FROM `projects` AS p1
RIGHT JOIN `activities` AS a1
ON p1.`id`=a1.`projectid`
AND p1.`orgid`=3
WHERE a1.`userid` = 26
AND a1.`active`=1
GROUP BY p1.`id`)
ORDER BY p1.`id`,A1.ID -- assumes A1.ID exists and you want to order in that fashion.
將Activites的任何限制移動到聯接本身。否則左連接表現得像內連接一樣;因爲它們不是用戶ID 26並且處於活動狀態,所以零值被消除。 – xQbert