2013-02-09 61 views
2

我有一個SQL查詢,我只需連接兩個表。一個表格包含註釋,另一個表格是用戶表格。我加入表格,以簡單的方式獲取有關寫評論(用戶名)的用戶的用戶信息,同時獲取評論(評論文本等)。SQL:加入計數不起作用

現在我想要計算註釋的數量,以便在頁面頂部寫入正確數量的註釋。我通過添加一個COUNT和一個別名來保存該值。

當我回顯numCount時,我得到了正確的評論值,但我在評論循環中沒有留言。只要我刪除了伯爵,我就會再次收到所有評論。我究竟做錯了什麼?

SELECT 
ncID, ncText, ncDate, 
uID, uName, uImageThumb, 
COUNT(a.ncID) AS numComments 
FROM tblNewsComments a LEFT JOIN tblUsers b 
ON a.ncUserID = b.uID 
WHERE a.ncNewsID = $newID 
ORDER BY ncDate DESC 
+0

爲了什麼數據庫? – 2013-02-09 01:49:50

回答

3

我打算假設這是MySQL(或者SQLite),因爲大多數其他RDBMS在這個查詢上會失敗。問題在於您缺少GROUP BY子句,在使用像COUNT()這樣的聚合函數時,除非要在整個行集上進行操作,否則這個子句是必需的。 MySQL的不尋常的行爲是允許缺少GROUP BY,或允許SELECT中不在GROUP BY中的列產生異常結果。

執行此操作的適當方法是加入子查詢,該子查詢返回COUNT()ncID

SELECT 
    ncID, 
    ncText, 
    ncDate, 
    uID, 
    uName, 
    uImageThumb, 
    /* The count returned by the subquery */ 
    ccount.numComments 
FROM 
    tblNewsComments a 
    LEFT JOIN tblUsers b ON a.ncUserID = b.uID 
    /* Derived table returns only ncID and count of comments */ 
    LEFT JOIN (
    SELECT ncID, COUNT(*) AS numComments 
    FROM tblNewsComments 
    GROUP BY ncID 
) ccount ON a.ncID = ccount.ncID 
WHERE a.ncNewsID = $newID 
ORDER BY ncDate DESC 

編輯哎呦 - 看起來像你想的計數每ncID,不是每個ncUserID算作我本來它。

+0

SQLite將支持提供的查詢 – 2013-02-09 01:50:08

+0

@OMGPonies的確如此。我沒有意識到SQLite的行爲也是如此。 (查詢中的PHP變量仍然可能表示MySQL) – 2013-02-09 01:54:28

0

我不知道你正在使用什麼SQL引擎,但你在這裏有什麼是不是有效的SQL,應該被標記爲這樣。

COUNT是一個聚合函數,你可以只適用於那些團體或整個表,所以你的情況,你可能會做

SELECT 
ncID, ncText, ncDate, 
uID, uName, uImageThumb, 
COUNT(a.ncID) AS numComments 
FROM tblNewsComments a LEFT JOIN tblUsers b 
ON a.ncUserID = b.uID 
WHERE a.ncNewsID = $newID 
GROUP BY ncID, ncText, ncDate, 
uID, uName, uImageThumb 
ORDER BY ncDate DESC 
+0

謝謝!我試過這個,但由於某種原因,它只給了我一個評論,當我嘗試循環和計數時。任何想法可能是錯的? – David 2013-02-09 01:51:29

+0

顯然,我不知道你的表結構,但ncID可能不應該成爲選擇列表的一部分,也不應該是 - 嘗試刪除它。這似乎是評論ID,對嗎? – 2013-02-09 01:54:35

+0

是的,這是評論ID(自動增量) – David 2013-02-09 01:55:12

0

您使用聚合函數(計數),但你」需要一個GROUP BY來從這個數字中獲得任何意義。

我建議增加 「GROUP BY [除COUNT所有其他字段名]」 您查詢

0

試試這個:

SELECT 
ncID, ncText, ncDate, 
uID, uName, uImageThumb, 
(SELECT COUNT(ncID) 
FROM 
tblNewsComments a 
INNER JOIN 
tblUsers b 
ON a.ncUserID = b.uID) 
AS numComments 
FROM tblNewsComments a LEFT JOIN tblUsers b 
ON a.ncUserID = b.uID 
WHERE a.ncNewsID = $newID 
ORDER BY ncDate DESC