我有一個系統,用戶可以在其中放入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%確定用戶將出現在該表中,即使它們不在其他表中。我用這個查詢得到了合適的數量!
我不確定你的數據庫設計是否合理。也許它有,但它看起來不像。 – 2011-04-13 06:30:36
它非常有意義。用戶發佈挑戰提示。該提示被髮送到「提示」表,並且包含海報的user_id等。其他用戶可以對該提示發表評論,這些提示會發送到「評論」表並且還包含user_id。最後,用戶可以對提示進行投票,他們會保存在「投票」表中,並且還包含user_id。這是做到這一點的唯一方法,並能夠跟蹤誰發佈/做什麼。我需要確定一個用戶是否投了票,或發佈了一條提示或評論,以便我可以允許或不允許他們更改他們的顯示名稱。 – HaLo2FrEeEk 2011-04-13 06:53:23
你得到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