2010-07-28 42 views
2

我的MySQL語句有問題。我需要一個查詢來計算用戶創建的評論數量和主題數量。我的表結構是這樣的:MySQL連接3個表和COUNT()不工作

Table 'users' 
------------- 
user_id 
user_name 
... 

Table 'topics' 
-------------- 
topic_id 
topic_user_id 
... 

Table 'topiccomments' 
--------------------- 
topiccomment_id 
topiccomment_user_id 
... 

到目前爲止,我已經能夠生產此查詢:

SELECT 
    u.user_id, 
    u.user_name, 
    COUNT(t.topic_user_id) as topic_count, 
    COUNT(tc.topiccomment_user_id) as topiccomment_count 
FROM 
    users as u 
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id 
    JOIN topics as t ON u.user_id = t.topic_user_id 
WHERE 
    u.user_id = t.topic_user_id AND 
    u.user_id = tc.topiccomment_user_id 
GROUP BY 
    u.user_id 

執行此查詢,但「TOPIC_COUNT」和「topiccomment_count」值完全錯誤,我不明白爲什麼。

我希望這裏有人能幫助我嗎?

+0

最好將其作爲兩個單獨的查詢來完成。如果您確實需要一個查詢,那麼創建兩個子查詢。 – mdma 2010-07-28 15:58:38

+0

我需要它在一個查詢中,因爲我需要能夠對'topic_count'和'topiccomment_count'字段進行mysql排序... 子查詢的查詢將如何看起來像?我沒有任何經驗與子查詢... – brtdv 2010-07-28 16:01:32

+0

也許你可以給一個例子與數據,錯誤和預期的結果 – Nicolas78 2010-07-28 16:01:34

回答

5

變化

COUNT(DISTINCT t.topic_id) as topic_count, 
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 

這將計算的不同主題和匹配的用戶ID話題評論的數量。之前,您要計算給定用戶的主題和主題評論的交叉產品中的行數。

如果它適用於您的情況,我會將其重構爲兩個查詢,一個用於計算主題,另一個用於topic_comments,因爲這會更有效。

+0

是的,就是這樣!該查詢正在工作! 非常感謝! gr,bert – brtdv 2010-07-28 16:05:31

2

快速射擊:嘗試更換計數(場)數(不同領域)

+0

嗨,謝謝你的回覆快! 我也嘗試過,但'topic_count'和'topiccomment_count'只是返回'1',而它應該是更高的數字... – brtdv 2010-07-28 15:59:35

2

首先,你可以刪除整個WHERE子句。這不是必須的,因爲您已經在JOIN中處理過它。

爲了解決您的問題,你的SELECT子句,而不是當前計報表您在使用本:

COUNT(DISTINCT t.topic_id) as topic_count, 
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 

您正在試圖計算主題或主題評論的數量。不是用戶數量(應該始終爲1)。

+0

是的,就是這樣!該查詢正在工作! 非常感謝! gr,bert – brtdv 2010-07-28 16:05:02

0

您應該計算主題和註釋ID,而不是評論/主題的user_id。

SELECT 
    u.user_id, 
    u.user_name, 
    COUNT(DISTINCT t.topic_id) as topic_count, 
    COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count 
FROM 
    users as u 
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id 
    JOIN topics as t ON u.user_id = t.topic_user_id 
GROUP BY 
    u.user_id 
1

JOIN的可能返回topiccommentstopics表的笛卡爾乘積因爲他們之間的關係沒有限制,這可以解釋爲什麼你得到一個高計數。

一個簡單的方法來解決這個問題是使用相關子查詢:

SELECT u.user_id, 
     u.user_name, 
     SELECT (COUNT(*) FROM topics t WHERE t.id = u.id), 
     SELECT (COUNT(*) FROM topiccomments tc WHERE tc.id = u.id) 
FROM users u; 

您還可以使用COUNT(DISTINCT t.topic_id)COUNT(DISTINCT tc.topiccomment_id)原始查詢中的一些其他的答案的建議。事實上,這在性能方面可能會更有效率。