mysql: проблема множественного объединения - PullRequest
3 голосов
/ 09 августа 2009

Я пытаюсь выбрать таблицу с несколькими объединениями, один для количества комментариев с помощью COUNT и один для выбора общего значения голосования с помощью SUM, проблема в том, что два объединения влияют друг на друга, вместо того, чтобы показывать:

3 голоса, 2 комментария

Я получаю 3 * 2 = 6 голосов и 2 * 3 комментария

Это запрос, который я использую:

SELECT t.*, COUNT(c.id) as comments, COALESCE(SUM(v.vote), 0) as votes
FROM (topics t)
LEFT JOIN comments c ON c.topic_id = t.id
LEFT JOIN votes v ON v.topic_id = t.id
WHERE t.id = 9

Ответы [ 3 ]

3 голосов
/ 09 августа 2009

То, что вы делаете, это антипаттерн SQL, который я называю Goldberg Machine . Зачем усложнять проблему, заставляя ее выполнять один SQL-запрос?

Вот как бы я действительно решил эту проблему:

SELECT t.*, COUNT(c.id) as comments
FROM topics t
LEFT JOIN comments c ON c.topic_id = t.id
WHERE t.id = 9;

SELECT t.*, SUM(v.vote) as votes
FROM topics t
LEFT JOIN votes v ON v.topic_id = t.id
WHERE t.id = 9;

Как вы обнаружили, объединение этих двух в один запрос приводит к декартову произведению. Могут быть хитрые и тонкие способы заставить его дать вам правильный ответ в одном запросе, но что произойдет, когда вам понадобится третья статистика? Гораздо проще сделать это в двух запросах .

1 голос
/ 09 августа 2009
SELECT t.*, COUNT(c.id) as comments, COALESCE(SUM(v.vote), 0) as votes
FROM (topics t)
LEFT JOIN comments c ON c.topic_id = t.id
LEFT JOIN votes v ON v.topic_id = t.id
WHERE t.id = 9
GROUP BY t.id

или, возможно,

SELECT `topics`.*,
(
    SELECT COUNT(*)
    FROM `comments`
    WHERE `topic_id` = `topics`.`id`
) AS `num_comments`,
(
    SELECT IFNULL(SUM(`vote`), 0)
    FROM `votes`
    WHERE `topic_id` = `topics`.`id`
) AS `vote_total`
FROM `topics`
WHERE `id` = 9
0 голосов
/ 09 августа 2009
SELECT t.*, COUNT(DISTINCT c.id) as comments, COALESCE(SUM(v.vote), 0) as votes
FROM (topics t)
LEFT JOIN comments c ON c.topic_id = t.id
LEFT JOIN votes v ON v.topic_id = t.id
WHERE t.id = 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...