2011-03-06 61 views
1

看到這個代碼MySQL的JOIN沒有選擇的答案,如果沒有票

SELECT x.*, z.rates 
FROM poll_answers x 
    JOIN 
    (SELECT answer_id, COUNT(id) AS `rates` 
    FROM poll_votes 
    GROUP BY answer_id) z 
    ON 
    x.id = z.answer_id 
WHERE x.poll_id = '$poll_id' 
ORDER BY x.id DESC 

它只是表明答案是它有更多的則0票,這意味着如果我的調查是新的,沒有票就絕不會顯示答案

這樣的問題如何,如果沒有vots更新這個代碼來顯示的答案太

+1

使用權JOIN。 – Joseadrian 2011-03-06 15:37:13

回答

1
SELECT x.*, z.rates 
FROM poll_answers x 
    LEFT JOIN 
    (SELECT answer_id, COUNT(id) AS `rates` 
    FROM poll_votes 
    GROUP BY answer_id) z 
    ON 
    x.id = z.answer_id 
WHERE x.poll_id = '$poll_id' 
ORDER BY x.id DESC 
0

嘗試這個

SELECT x . * , z.rates 
FROM poll_answers x 
LEFT JOIN (SELECT answer_id, COUNT(id) AS `rates`  
FROM poll_votes  
GROUP BY answer_id) z  
     ON x.id = z.answer_id 
WHERE x.poll_id = '$poll_id' ORDER BY x.id DESC 
2

你必須做一個LEFT JOIN,而不僅僅是一個JOIN

SELECT x.*, z.rates 
FROM poll_answers x 
    LEFT JOIN 
    (SELECT answer_id, COUNT(id) AS `rates` 
    FROM poll_votes 
    GROUP BY answer_id) z 
    ON 
    x.id = z.answer_id 
WHERE x.poll_id = '$poll_id' 
ORDER BY x.id DESC 

JOININNER JOIN用於連接兩個表,並只保留其存在於兩側的行。

LEFT JOIN保留所有行左側表(FROM子句中的表)和右表中添加信息(表你與加盟)時可能

RIGHT JOIN不斷從右邊的所有行表並在可能的情況下從左表中添加信息。

在你的情況,因爲你想要所有的poll_answers你必須使用LEFT JOIN

請注意,rates將是null而不是0當沒有投票。如果要過濾單個查詢,您應該 - 出於性能原因 - 將poll_answers添加到分組子查詢中,如果您要過濾單個查詢,則可以使用此SELECT x.*, CASE z.rates IS NULL 0 ELSE z.rates替換第一行,如果您想擁有0

0

,因爲你只想計算一次投票的票數,而不是整個表。

內部查詢應該是這樣的:

(SELECT v.answer_id, COUNT(v.id) AS `rates` 
FROM poll_answers a JOIN poll_votes v 
    ON a.answer_id = v.answer_id 
WHERE a.poll_id = '$poll_id' 
GROUP BY v.answer_id)