2011-08-05 44 views
0

我有一個奇怪的問題。我有一個用戶表,每個用戶都有一個唯一的用戶標識。用戶能夠發佈保存到不同表格的評論(提示),每個評論行也具有唯一的ID並且還包含發佈它的用戶的用戶ID。最後,其他用戶可以對評論投票。投票連同投票人的用戶ID和投票評論的評論ID(無唯一ID)一起存儲在另一個表中。奇數MySQL與LEFT JOIN行爲

我計算一個人的評分爲最多的票數減去票數,所以4上和2下會導致2的評分,很簡單。我想要有一個可以根據某人的評價排序的成員名單,但我遇到了一些問題。

我使用COUNT()和CASE確定上下票數:

(COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating', 

當我提供單個用戶ID到查詢這工作,在WHERE子句,WHERE USER_ID = 1但是,我想獲得所有成員及其評級的列表,這就是問題發生的地方。我查詢:

SELECT DISTINCT 
    U.user_id, 
    (COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE NULL END)) AS 'rating', 
    username 
    FROM users U 
    LEFT JOIN tips T ON U.user_id = T.user_id 
    LEFT JOIN votes V ON T.tip_id = V.tip_id 

基本上,這應該找到在其中tip_id等於在提示tip_id表中的所有行,然後在提示所有行表,其中user_id是等於用戶表中的user_id。我遇到的問題是我只返回一行,即使用戶表中有83行。投票表中有287行,其中有257個投票和30個投票。我得到的這一行的評分爲227(這是257-30),這意味着票數表中的所有行都被計算在內,而不僅僅是我要查找的特定user_id的那些行。我想得到每個用戶對他或她的所有提示都有的贊成票和反對票的數量。

基本上,對於users表中的每個user_id,它應該爲該用戶標識查找所有的tip_id,然後爲這些tip_id的所有投票。

這是不可能的,或者我錯過了可怕的明顯的東西?

編輯:我應該注意,如果我完全刪除COUNT()行,那麼查詢工作,返回適當的行數......它只是沒有投票信息。

回答

0
SELECT 
    U.user_id, 
    (COUNT(CASE WHEN V.vote = 1 THEN 1 ELSE NULL END)-COUNT(CASE WHEN V.vote = 0 THEN 1 ELSE  NULL END)) AS 'rating', 
username 
FROM users U 
    LEFT JOIN tips T ON U.user_id = T.user_id 
    LEFT JOIN votes V ON T.tip_id = V.tip_id 
GROUP BY U.user_id, rating, username 

我沒有測試它。但是我認爲你錯過了group by子句。

+0

所以這是愚蠢的明顯。我記得以前有這樣的問題,但無法在任何地方找到代碼。我剛剛添加了「GROUP BY U.user_id」,它工作得很好,謝謝! (接受) – HaLo2FrEeEk

+0

:D很高興幫助。 – Jaxedin