2013-08-19 57 views
1

我有DB與幾桌,其中2個被定義爲:列表中其他表中的所有項目和數量發生

CREATE TABLE [projects] (
    [id] INTEGER   NOT NULL PRIMARY KEY, 
    [code] VARCHAR(128) UNIQUE NOT NULL COLLATE NOCASE, 
    [name] VARCHAR(128) DEFAULT "Not Set" NOT NULL COLLATE NOCASE 
) 

CREATE TABLE [tasks] (
    [id]   INTEGER NOT NULL PRIMARY KEY, 
    [project_id] INTEGER NOT NULL, 
    [notes]  VARCHAR(512) DEFAULT 'Not Set' NOT NULL COLLATE NOCASE, 
    [start]  DATE NOT NULL, 
    [finish]  DATE NOT NULL, 
    [rate_id]   INTEGER DEFAULT 1 NOT NULL 
) 

我有這樣的查詢返回的項目的詳細清單,使用次數:

SELECT p.*, count(t.project_id) as length 
FROM projects as p, tasks as t 
WHERE p.id=t.project_id 
GROUP BY p.code 
ORDER BY length DESC; 

但正如我發現它會返回列表小於項目如果沒有使用項目ID(沒有給定項目ID的任務)。

有沒有辦法以相同的格式創建完整的項目列表到我當前的查詢和添加長度,但包括所有項目和沒有任務長度將有0?

回答

1

要獲得沒有任務的項目,請使用left outer join。 的ifnull功能將任何NULL零:

SELECT p.*, IFNULL(COUNT(t.project_id), 0) AS length 
FROM projects AS p 
LEFT JOIN tasks AS t ON p.id = t.project_id 
GROUP BY p.code 
ORDER BY length DESC 
+0

它工作得很好,你能解釋留下了自己的話加入?謝謝。 –

+0

維基百科解釋有什麼不對? –

+0

:)什麼都沒有,但我喜歡其他開發者的純英文解釋。然而當我看到這個時:_「左外連接(或簡單的左連接)對於表A和B的結果總是包含」左「表(A)的所有記錄」 - - 非常清楚:) –

相關問題