Базовый пример sql-запроса - PullRequest
1 голос
/ 03 января 2012

У меня есть две таблицы:

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

Я должен выбрать (*) все значения в NEWS, а также подсчитать голоса в таблице 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.

Ответы [ 5 ]

5 голосов
/ 03 января 2012

при условии, что положительные голоса имеют 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
3 голосов
/ 03 января 2012
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 голос
/ 03 января 2012

Попробуйте это -

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 означает голосование "против".

1 голос
/ 03 января 2012
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
0 голосов
/ 03 января 2012

select (SELECT count (*) FROM NEWS_VOTES WHERE news_id = (тот же ID) И голос = 0) Positive_votes, (SELECT count (*) FROM NEWS_VOTES WHERE news_id = (тот же ID) И голос = 1) отрицательные_воты от двойного;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...