2017-08-16 47 views
0

試圖使此mysql查詢正常工作。MySQL左側加入計數活動並返回null

說明:有兩個表,其中一個包含所有帶有組織標識列的項目,第二個包含與項目表相關的列投影的所有活動。我想要統計具有用戶標識的活動表中的所有活動,並且活動時間爲1。 但是,棘手的部分來了,我無法工作。它不收集缺少活動表中的項目,並與數0.目前這些我想表明,博內具有獨特的專案編號對應的所有項目

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 

給出:

enter image description here

正如你所看到的,例如6和2是不正確的。 請幫忙。謝謝。

+1

將Activites的任何限制移動到聯接本身。否則左連接表現得像內連接一樣;因爲它們不是用戶ID 26並且處於活動狀態,所以零值被消除。 – xQbert

回答

0

未經測試:

將活動限制移到了連接上。

此外,還是帶來了超過你想要的,通過移動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. 
+0

令人驚歎!非常感謝你,該死的我一直在爲此而苦苦掙扎。現在,我已經學到了一些新的東西,並在未來如何實現這一目標。謝了哥們! – Amc

+0

使用外部聯接時,一般而言,僅對顯示所有記錄的表應用限制。左連接右側表上的限制應放置在連接上,或者連接起到內連接的作用。這裏的OR子句w/o()的引起了大部分問題。 – xQbert

+0

是否有可能在活動表中包含空白或未包含在項目中的活動? – Amc