Запрос суммирующий данные из нескольких таблиц

MasterSID

Новичок
Запрос суммирующий данные из нескольких таблиц

Допустим есть таблицы category, message, question. messages и questions имеют поле category_id. Мне нужно получить выборку сколько messages+questions в каждой категории. Как это можно сделать? У меня в распоряжении MySQL5.
 

MasterSID

Новичок
count() + left join + group by
у меня не получается. Но скорее всего я просто неправильно делаю. Можете пример простой привести? У меня на самом деле еще куча других условий, я задачу сильно упростил.
 

Gas

может по одной?
и всё таки перечисленные операторы и функции не отменяют необходимость заюзать и юнион
хм, попросту ты обычно не говоришь ;)
но почему? вроде, вариант c count(distinct `uniq_field`) + ... даст что нужно и без union'а.
 

zerkms

TDD infected
Команда форума
Gas
у него 2 таблы, которые связаны с третьей (насколько я понял из "описания")

т.е.

ВЫБРАТЬ 1 и 3 UNION ВЫБРАТЬ 2 и 3

как-то так ;)
 

Gas

может по одной?
[sql]
SELECT t1.id, COUNT(DISTINCT t2.id)+COUNT(DISTINCT t3.id) FROM t1 LEFT JOIN t2 ON t2.category_id=t1.id LEFT JOIN t3 ON t3.category_id=t1.id
GROUP BY t1.id;
[/sql]
не понимаю :) где я туплю ?

Ну и что можно сделать union'ом я, естественно, не отрицаю.
 

zerkms

TDD infected
Команда форума
Gas
а, ну разве что "принципиально" сделать всё без UNION и радоваться себе (см. спортивный интерес) ;)
но смысл перемножать данные, которые логически никак не связаны? ;)
 

Gas

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

zerkms

TDD infected
Команда форума
думал я просто чего-то не понимаю - разобраться хотел.
у меня так один запрос (делающий то же самое, что и в тредстартовом посте) тоже вырос в 7 или 8 джоинов, с дистинктами... оно конечно нелогично и неэффективно, но чертовски красиво смотрится, угу ;)
 

chira

Новичок
zerkms
а так (если MySQL5):

SELECT с.id, IFNULL(m.m_count,0) + IFNULL(q.q_count,0)
FROM category c
LEFT JOIN (SELECT category_id, COUNT(*) m_count FROM message GROUP BY category_id) m ON m.category_id = c.id
LEFT JOIN (SELECT category_id, COUNT(*) q_count FROM question GROUP BY category_id) q ON q.category_id = c.id
 

Gas

может по одной?
chira
интересный вариант
если мало категорий и много message/question - этот запрос, по логике, должен быть самым шустрым, несмотря на join'ы без индексов.
 

chira

Новичок
Gas
В большинстве случаев категорий должно быть намного меньше, чем сообщений и вопросов, но окончательную правду об этом, может поведать только MasterSID. :)
 

Gas

может по одной?
chira
ну да, запросик в закладки себе добавил.
и это не первый твой запрос, который уже там есть :)
 
Сверху