我需要通過一個查詢爲每位家長選擇有子女的子女和子女數。 現在我用一個查詢:爲每位家長選擇有子女的父母和子女數
SELECT table_a.*, (SELECT COUNT(*) FROM table_b WHERE table_b.LID=table_a.LID AND table_b.Yes=0) AS Co
FROM table_a
WHERE table_a.Ind>0 ORDER BY table_a.Ind ASC
我想我錯了......是嗎?
我需要通過一個查詢爲每位家長選擇有子女的子女和子女數。 現在我用一個查詢:爲每位家長選擇有子女的父母和子女數
SELECT table_a.*, (SELECT COUNT(*) FROM table_b WHERE table_b.LID=table_a.LID AND table_b.Yes=0) AS Co
FROM table_a
WHERE table_a.Ind>0 ORDER BY table_a.Ind ASC
我想我錯了......是嗎?
你說得對 - 你做錯了。即使它起作用,但獲得您喜歡的結果也是錯誤的方法。爲了從一個一對多的關係得到總的,我們使用連接和分組爲:
SELECT a.ind, count(*) Total
FROM a JOIN b ON a.lid = b.lid
WHERE a.ind>0 AND b.yes = 0
GROUP BY a.ind
ORDER BY a.ind
您的解決方案應該可以正常工作,但是子選擇會針對每行table_a
執行,這使得它不是最佳解決方案。更好的解決方案是JOIN
這兩個表,並使用GROUP BY
以較低的性能成本獲得相同的結果。
SELECT table_a.LID
, COUNT(*) AS Co
FROM table_a
LEFT OUTER JOIN table_b ON table_b.LID = table_a.LID AND table_b.Yes = 0
WHERE table_a.Ind > 0
GROUP BY
table_a.LID
ORDER BY
table_a.Ind ASC
此外,在我看來,你應該總是別名你的表,並使用該別名,使語句更簡潔,更容易閱讀。
SELECT a.LID
, COUNT(*) AS Co
FROM table_a AS a
LEFT OUTER JOIN table_b AS b ON b.LID = a.LID AND b.Yes = 0
WHERE a.Ind > 0
GROUP BY
a.LID
ORDER BY
a.Ind ASC
是什麼讓你改變了公認的標誌? –