此查詢運行良好,并給我這樣的輸出:
[(1, 9), (2, 12), (4, 14), (6, 14)]
query = """
SELECT users.id,
count(tasks.userId)
FROM users
LEFT JOIN tasks ON users.id = tasks.userId
WHERE tasks.completed = FALSE
GROUP BY users.id
"""
但是,當我添加另一個左連接時,它并沒有給我準確的結果:
query = """
SELECT users.id,
count(tasks.userId), count(songs.userId)
FROM users
LEFT JOIN tasks ON users.id = tasks.userId
LEFT JOIN songs ON users.id = songs.userId
WHERE tasks.completed = FALSE
GROUP BY users.id
"""
結果應如下所示:
[(1, 9, 10), (2, 12, 10), (4, 14, 10), (6, 14, 10)]
但相反,我的結果如下所示:
[(1, 90, 90), (2, 120, 120), (4, 140, 140), (6, 140, 140)]
這看起來像tasks x 10count(tasks) 和 count(song) 的值我錯過了什么?
的想法count(tasks.userId)是找到 userId 匹配的任務數。
uj5u.com熱心網友回復:
分別聚合tasks,songs然后加入users聚合的結果:
SELECT u.id,
COALESCE(t.count_tasks, 0) count_tasks,
COALESCE(s.count_songs, 0) count_songs
FROM users u
LEFT JOIN (
SELECT userId, COUNT(*) count_tasks
FROM tasks
WHERE completed = FALSE
GROUP BY userId
) t ON u.id = t.userId
LEFT JOIN (
SELECT userId, COUNT(*) count_songs
FROM songs
GROUP BY userId
) s ON u.id = s.userId;
我不確定您是否真的想要LEFT連接(至少對于 table tasks),因為在您的代碼中,您所說的第一個查詢回傳您所期望的,雖然它包含一個LEFT連接,但連接實際上是一個INNER連接,因為條件WHERE tasks.completed = FALSE回傳只有匹配的行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/463256.html
標籤:Python sql sqlite 通过...分组 左连接
