2011-04-13 38 views
1

我有一個系統,用戶可以在其中放入3種不同的信息:小費,評論和投票。這些信息被保存到3個不同的表格中。每個表的鏈接列是用戶標識。我想要做一個查詢來確定用戶是否有任何三種類型的任何信息。我試圖在單個查詢中完成,但它完全錯誤。以下是我與現在的工作:從同一列的多個表中計算結果

SELECT DISTINCT 
    * 
    FROM tips T 
    LEFT JOIN comments C ON T.user_id = C.user_id 
    LEFT JOIN votes V ON T.user_id = V.user_id 
    WHERE T.user_id = 1 

這似乎只能是越來越尖端,複製儘可能多的投票或評論有,即使票或意見並沒有被指定USER_ID製造。

我只需要一個單一的號碼作爲回報,而不是每個類型的個人計數。我基本上想要在user_id下保存的提示,評論和投票數量的總和,但我不想做三個查詢。

任何人有任何想法?

編輯實際上,我甚至沒有技術上需要實際的計數,我只需要知道是否有任何這三個表中的任何行與該user_id。

編輯2:我幾乎與此有它:

SELECT 
    COUNT(DISTINCT T.tip_id), 
    COUNT(DISTINCT C.tip_id), 
    COUNT(DISTINCT V.tip_id) 
    FROM tips T 
    LEFT JOIN comments C ON T.user_id = C.user_id 
    LEFT JOIN votes V ON T.user_id = V.user_id 
    WHERE T.user_id = 1 

我與USER_ID 1測試(我)。我已經提出了11個提示,投了4次,並沒有發表任何評論。我的迴歸是一排3列:11,0,4。這是正確的數字。然而,我測試了一個用戶沒有任何提示或評論,但已投票3次,所有計數返回0,它應該已經返回:0,0,3.

問題是我似乎是,如果我用於WHERE子句的表沒有來自該user_id的任何行,那麼即使其他表具有該user_id的行,我也會在整個板上得到0。我可以使用這個查詢:

SELECT 
    (SELECT COUNT(*) FROM tips WHERE user_id = 2) + 
    (SELECT COUNT(*) FROM comments WHERE user_id = 2) + 
    (SELECT COUNT(*) FROM votes WHERE user_id = 2) AS total 

但我真的想避免運行多個查詢,即使他們是這樣的子查詢。

UPDATE

感謝王牌,我想通了這一點:

SELECT 
    (COUNT(DISTINCT T.tip_id) + COUNT(DISTINCT C.tip_id) + COUNT(DISTINCT V.tip_id)) AS total 
    FROM users U 
    LEFT JOIN tips T ON U.user_id = T.user_id 
    LEFT JOIN votes V ON U.user_id = V.user_id 
    LEFT JOIN comments C ON U.user_id = C.user_id 
    WHERE U.user_id = 4 

用戶表包含回合的用戶包括,顯然,用戶ID的實際信息。我使用用戶表作爲父項,因爲我可以100%確定用戶將出現在該表中,即使它們不在其他表中。我用這個查詢得到了合適的數量!

+0

我不確定你的數據庫設計是否合理。也許它有,但它看起來不像。 – 2011-04-13 06:30:36

+0

它非常有意義。用戶發佈挑戰提示。該提示被髮送到「提示」表,並且包含海報的user_id等。其他用戶可以對該提示發表評論,這些提示會發送到「評論」表並且還包含user_id。最後,用戶可以對提示進行投票,他們會保存在「投票」表中,並且還包含user_id。這是做到這一點的唯一方法,並能夠跟蹤誰發佈/做什麼。我需要確定一個用戶是否投了票,或發佈了一條提示或評論,以便我可以允許或不允許他們更改他們的顯示名稱。 – HaLo2FrEeEk 2011-04-13 06:53:23

+0

你得到0,0,0而不是0,0,3的原因是你的基表是'tips',它沒有user_id,所以你用'votes'用'user_id'連接它。首先,所有的行都將從'tips'中獲得,然後如果你與其他表一起'LEFT JOIN'連接。 MySql將查找每個擁有'votes'的user_id,然後加入它。然後,所有在'LEFT table or tips'中沒有的user_id將被排除以從'votes'中得到,這就是爲什麼你不能在'votes'中得到user_id的原因。此外,使用DISTINCT時會出現問題,因爲列中每個相等值的結果都會計爲1. – ace 2011-04-13 09:29:19

回答

1

據我瞭解你的問題。您想要爲每位用戶計算總評論數+提示數+投票數。雖然我不太清楚,請看下面的查詢。我添加了細節列,這是一個交叉表查詢,因爲有人教我。

EDITED QUERY:

SELECT 
     COALESCE(COALESCE(t2.tips,0) + COALESCE(c2.comments,0) + COALESCE(v2.votes,0)) AS `Totals` 
    FROM parent p 
    LEFT JOIN (SELECT t.user_id, COUNT(t.tip_id) AS tips FROM tips t GROUP BY t.user_id) t2 
     ON p.user_id = t2.user_id 
    LEFT JOIN (SELECT c.user_id, COUNT(c.tip_id) AS comments FROM comments c GROUP BY c.user_id) c2 
     ON p.user_id = c2.user_id    
    LEFT JOIN (SELECT v.user_id, COUNT(v.tip_id) AS votes FROM votes v GROUP BY v.user_id) v2 
     ON p.user_id = v2.user_id 
    WHERE p.user_id = 1; 

注:這是爲了得到這並不以其它表的表中的結果,使用的父表。

我在我的JOIN中使用子查詢的原因是創建一個虛擬表,它將獲得每個表的tip_id的總和。另外,我在DISTINCT上遇到了與您相同的查詢問題,因此我最終收到了此查詢。

我知道你不喜歡使用子查詢,但我失敗了沒有子查詢。現在,這是我所能做到的。

+0

我只需要知道用戶是否已投票或發佈了提示或評論。如果其中任何一個爲真,那麼計數應該大於0.檢查第一篇文章中的編輯。所有三個表中有兩列相同:user_id和tip_id,因爲評論和投票都與提示本身相關聯。基本上,如果三個表中的任何一個包含user_id =#的行,那麼我應該得到大於0的數字,如果沒有表中包含user_id =#的行,則計數應該爲0. – HaLo2FrEeEk 2011-04-13 07:09:04

+0

我認爲查詢會顯示你想要的結果。我將在查詢中編輯字段名稱以反映您的字段,並且將爲ID添加WHERE子句。如果它仍然不是你想要的,如果我有時間的話,我會嘗試做一個新的查詢。 – ace 2011-04-13 07:31:20

+0

對不起,但我完全不理解你的查詢。 FROM子句中選擇的目的是什麼?您將行選入需要表的子句中。當我嘗試運行它時,出現各種錯誤。我只需要一個單一的號碼作爲回報。這個數字將是指定user_id提示,評論和投票數量的總和。如果用戶提出了1個小費,沒有評論和2個投票,那麼計數將是3.如果他們提出了5個提示,2個評論,並沒有投票,那麼計數將是7,是否合理? – HaLo2FrEeEk 2011-04-13 07:41:40

相關問題