2013-01-31 62 views
0

我有一個sql查詢似乎返回一個意外的空白行。這個查詢有一個右連接到另一臺,但是當返回行返回我空值..使用RIGHT JOIN的SQL查詢意外的結果

SELECT e.error_id, e.user_id, e.error_title, e.error_content, e.error_answers, 
     e.error_votes, e.error_views, e.error_added_date, u.user_name 
    FROM errors e 
    JOIN users u 
    ON u.user_id=e.user_id 
    RIGHT JOIN answers a 
    ON a.error_id=e.error_id AND a.answer_accepted='1' 
    GROUP BY e.error_id 
    ORDER BY e.error_added_date DESC 

此查詢應該返回我一個單列但它返回我的預期行,一行空白值.. 這是爲什麼?

+----------------------------------------------------------------------------------------------------+ 
answer_id | error_id | user_id | answer_content | answer_accepted | answer_votes | answer_added_date | 
1   | 3  | 1  | text   | 0    | 0   | 2013-01-31 12:49:12 
2   | 3  | 1  | text   | 1    | 1   | 2013-01-31 12:52:29 
3   | 3  | 1  | text   | 0    |-1   | 2013-01-31 12:53:45 
4   | 2  | 1  | text   | 0    |-1   | 2013-01-31 12:53:45 
+----------------------------------------------------------------------------------------------------+ 

結果:

+-------------------------------------------------------------------------------+ 
| 1 | 1 | text | 3 | 0 | 2 | 2013-01-29 16:56:20 | Mihai Matei | 
|NULL | NULL | NULL | NULL | NULL | NULL |  NULL   | NULL  | 
+-------------------------------------------------------------------------------+ 
+0

你可以顯示的結果嗎? – Narnian

+0

我想知道是否有空錯誤ID的答案。由於您正在對error_id進行分組,因此可能會得到一個空行。 – Narnian

+0

我剛剛發佈了結果..謝謝 –

回答

2

這是發生,因爲你正在做右連接。我想你想要一個左連接或一個內連接。

右連接表示返回右側的所有表格行和左側的匹配行。因爲你的結果集不包括來自答案表(右表​​)的任何列,所以你可以得到一組所有的空值。換句話說,答案表中有一行,錯誤和用戶表中沒有相應的行。

鑑於對這個答案在評論中附加條件,這裏的查詢我會嘗試:

SELECT e.error_id, e.user_id, e.error_title, e.error_content, e.error_answers, 
     e.error_votes, e.error_views, e.error_added_date, u.user_name 
    FROM errors e 
    JOIN users u 
    ON u.user_id=e.user_id 
    LEFT JOIN answers a 
    ON a.error_id = e.error_id and a.answer_accepted = '1' 
    WHERE a.answer_id is null 
    GROUP BY e.error_id 
    ORDER BY e.error_added_date DESC 
+0

謝謝你的答案..請告訴我,我應該如何使這個查詢返回我只有錯誤,沒有任何答案answer_accepted =' 1' asnwers表 –

+0

再次謝謝你..我找到了解決辦法使用'WHERE e.error_id NOT IN( \t \t \t \t \t \t \t \t SELECT DISTINCT ERROR_ID FROM答案WHERE answer_accept = '1' \t \t \t \t \t \t \t \t)' –

+0

請參閱我的答案上面的查詢嘗試。 –