2012-01-03 63 views
1

我有兩個表:一個基本的SQL查詢例子

NEWS (id, news_content) 
NEWS_VOTES (vote, news_id) 

我應該選擇(*)對新聞的所有值,並且還指望NEWS_VOTES表投票,其中news.id和news_votes.new_id是相同。

更清晰一點的解釋是:

  1. 我選擇上NEWS表中的所有值。
  2. 根據 「ID」 的值,我也選擇:

反對票:

SELECT count(*) FROM NEWS_VOTES WHERE news_id = (same ID) AND vote = 0 

贊成票:

SELECT count(*) FROM NEWS_VOTES WHERE news_id = (same ID) AND vote = 1 

我必須這樣做在一個單一的查詢。

網站上的輸出將會像「這個消息得到57個正面票和67個反對票」。

謝謝。

Ps。我使用MYSQL。

+0

你如何區分正面和負面的投票?他們正在使用相同的查詢! :-O – 2012-01-03 10:30:31

+2

負面和正面選票對'vote'有相同的價值? – Matten 2012-01-03 10:30:43

+0

試試聯盟... – duffymo 2012-01-03 10:30:56

回答

5

假設贊成票有vote=1

select 
    n.id, 
    n.news_content, 
    (select count(*) from news_votes where news_id=n.id and vote = 1) as positive_votes, 
    (select count(*) from news_votes where news_id=n.id and vote = 0) as negative_votes 
from news n 
+0

非常感謝。 :) – Aristona 2012-01-03 10:46:57

3
SELECT n.id, n.news_content, 
     COUNT(v1.vote) AS negative, 
     COUNT(v2.vote) AS positive 
FROM news n 
LEFT JOIN news_votes v1 ON v1.news_id = n.id 
LEFT JOIN news_votes v2 ON v2.news_id = n.id 
HAVING v1.vote = 0 AND HAVING v2.vote = 1 
GROUP BY v1.news_id, v2.news_id 
ORDER BY id DESC 
1
select id, news_content, 
    coalesce(v.positive, 0) as positive, 
    coalesce(v.negative, 0) as negative 
from news n 
left join (
    select news_id, 
     sum(case when vote = 1 then 1 else 0 end) as positive, 
     sum(case when vote = 0 then 1 else 0 end) as negative 
    from news_votes 
    group by news_id 
) v on n.id = v.news_id 
1

嘗試這一個 -

SELECT 
    n.*, 
    COUNT(IF(nv.vote = 1, 1, NULL)) Positive_Votes, 
    COUNT(IF(nv.vote = 0, 1, NULL)) Negative_Votes 
FROM news n 
    LEFT JOIN NEWS_VOTES nv 
    ON nv.news_id = n.id 
GROUP BY 
    n.id 

哪裏投票= 1表示積極投票,以及投票= 0表示反對票。

0

選擇 (SELECT FROM NEWS_VOTES COUNT(*)WHERE news_id =(相同的ID)和表決= 0)positive_votes, (SELECT COUNT(*)FROM NEWS_VOTES WHERE news_id =(相同的ID)和表決= 1)negative_votes 來自雙重;