MySQL ПРИСОЕДИНЯЙТЕСЬ к SUM - PullRequest
       2

MySQL ПРИСОЕДИНЯЙТЕСЬ к SUM

1 голос
/ 25 ноября 2010

Этот вопрос, вероятно, задавался много раз, поэтому, пожалуйста, извините меня за дубликаты, но я просто не мог найти что-то подобное и не смог построить что-то похожее на то, чего я хочу достичь.

Например, допустим, у меня есть следующая структура таблицы:

//tasks
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   |  P  |  None   |  AI   |
| user  | int(11)      | NO   |     |  None   |       |
| data  | varchar(200) | NO   |     |  None   |       |
+-------+--------------+------+-----+---------+-------+

//votes
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | NO   |  P  |         |  AI   |
| user  | int(11)      | NO   |     |         |       |
| item  | int(11)      | NO   |     |         |       |
| up    | tinyint(1)   | NO   |     | 0       |       |
| down  | tinyint(1)   | NO   |     | 0       |       |
+-------+--------------+------+-----+---------+-------+

Со следующими данными:

//tasks
+----+------+------------+
| id | user |    data    |
+----+------+------------+
| 1  |  1   | something  |
| 2  |  2   | lorem ip   |
| 3  |  1   |   biggy    |
+----+------+------------+

//votes
+----+------+------+----+------+
| id | user | item | up | down |
+----+------+------+----+------+
| 1  |  8   |  1   | 1  |  0   |
| 2  |  4   |  1   | 1  |  0   |
| 3  |  2   |  1   | 0  |  1   |
| 4  |  2   |  2   | 1  |  0   |
| 5  |  1   |  2   | 1  |  0   |
+----+------+------+----+------+

Я хочу сделать что-то похожее на:

   SELECT r.* FROM `tasks` WHERE `user` = '1' r
LEFT JOIN (SELECT SUM(t.up) AS up,
                  SUM(t.down) AS down
             FROM `votes` t
            WHERE t.item = r.id) r ON r.id = t.item

И да, это мой запрос, но он не работает, и я не знаю, как это исправить.

В основном я хочу:

  1. Выбрать все из таблицы задач , где user - "x"
  2. Присоединиться к каждой строке из задач (выбрано)на шаге 1) с суммой up, суммой down из таблицы голосов , где item равно id с tasks

И это должно привести к чему-то вроде (т.е. user = 1):

+----+------+------------+----+------+
| id | user |    data    | up | down |
+----+------+------------+----+------+
| 1  |  1   | something  | 3  |  1   |
| 3  |  1   |   biggy    | 0  |  0   |
+----+------+------------+----+------+

Что ж, я надеюсь, что вы, ребята, понимаете и можете помочье с этим.

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 25 ноября 2010

Предложение WHERE должно идти ниже соединений, а псевдонимы должны объявляться с использованием AS.Это (синтаксически) исправленная версия вашего запроса:

   SELECT r.*
     FROM `tasks`
LEFT JOIN (
             SELECT SUM(t.up) AS up,
                    SUM(t.down) AS down
               FROM `votes` AS t
              WHERE t.item = r.id
          ) AS r
       ON r.id = t.item
    WHERE `user` = '1'

Вот как бы я это сделал (не проверено):

   SELECT `tasks`.`id`,
          `tasks`.`user`,
          `tasks`.`data`,
          `votes`.`up`,
          `votes`.`down`
     FROM `tasks`
LEFT JOIN (
               SELECT `item`,
                      SUM(`up`) AS `up`,
                      SUM(`down`) AS `down`
                 FROM `votes`
             GROUP BY `item`
          ) AS `votes`
       ON `votes`.`item` = `tasks`.`id`
    WHERE `tasks`.`user` = 1
2 голосов
/ 25 ноября 2010

Давайте посмотрим, я бы кодировал что-то вроде этого:

SELECT t.id, t.user, t.data, ifnull(u.total, 0) as up, ifnull(d.total, 0) as down
FROM
    tasks AS t LEFT OUTER JOIN (
        SELECT item, SUM(up) AS total FROM votes GROUP BY item
    ) AS u ON t.id = u.item LEFT OUTER JOIN (
        SELECT item, SUM(down) AS total FROM votes GROUP BY item
    ) AS d ON t.id = u.item
WHERE t.user = 1;

Затем для отображения обоих итогов в одной строке вы можете попробовать:

SELECT t.id, t.user, t.data,
    ifnull((SELECT SUM(up) FROM votes GROUP BY item WHERE item = t.id), 0) AS up,
    ifnull((SELECT SUM(down) FROM votes GROUP BY item WHERE item = t.id), 0) AS down
FROM tasks AS t
WHERE t.user = 1;

Или попробуйте это:

SELECT t.id, t.user, t.data, IFNULL(tt.up, 0) AS up, IFNULL(tt.down, 0) AS down
FROM
    tasks AS t LEFT OUTER JOIN (
        SELECT item, SUM(up) AS up, SUM(down) AS down
        FROM votes
        GROUP BY item
    ) AS tt ON t.id = tt.item
WHERE t.user = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...