Объединение двух таблиц в MySQL - PullRequest
6 голосов
/ 14 июля 2011

У меня есть следующая таблица под названием голосования:

Votes

Я пытаюсь объединить список элементов, таблицу пользователей и эту таблицу голосов.

      SELECT list_items.item_id, text, date_added, username 
        FROM list_items 
NATURAL JOIN users, votes 
       WHERE list_id = 3

Этот запрос дает мне следующее:

SQL Query Preformed

Я хотел бы получить общее количество голосов для каждого элемента list_item, а также столбец для up_votes идругой для down_votes.И, конечно, я не хочу, чтобы item_id повторялся таким образом.

Я попытался объединить SUM и IF, как объяснено в видео Nettuts + , но учебное пособие было слишком простым.

РЕДАКТИРОВАТЬ: Вот таблица list_items: list_items

Ответы [ 2 ]

1 голос
/ 14 июля 2011
SELECT list_items.text, list_items.item_id, SUM(votes.vote=1) AS upvote, SUM(votes.vote=-1) AS downvote
FROM list_items
LEFT JOIN votes ON list_items.item_id = votes.item_id

Сложной частью являются два вызова суммы. Если поле голосования равно 1, то vote=1, которое оценивается как ИСТИНА, которое MySQL преобразует в целое число 1 для целей SUM ().Если это не 1, тогда оно оценивается как ложное, которое приводится к 0 и ничего не делает для SUM ().


whoops, должно иметь

GROUP BY list_items.item.id

в конце.

0 голосов
/ 14 июля 2011

Попробуйте:

    SELECT li.item_id, li.text, li.date_added, u.username,
           SUM(IF(v.vote = 1, 1, 0)) up_votes,
           SUM(IF(v.vote = -1, 1, 0)) down_votes,
           COUNT(v.vote) total_votes
      FROM list_items li
INNER JOIN users u ON li.user_id = u.id
INNER JOIN votes v ON li.item_id = v.item_id
     WHERE li.list_id = 3
  GROUP BY li.item_id

Предполагается, что столбец идентификатора пользователя с именем id в вашей таблице пользователей.

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