Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток!
Имеется две таблицы:
1. articles
| id | section_id | title | content |
2. comments
| id | article_id |comm_text|
В результате выборки нужно получить по 5 последних статей для каждого раздела (section_id) с количеством комментариев к этим статьям.
На данный момент задача решена таким образом:
SELECT a.*, COUNT(c.id) AS tot_comm
FROM articles AS a
LEFT JOIN comments AS c ON a.id = c.article_id
WHERE a.section_id = <айди раздела>
GROUP BY a.id
ORDER BY a.id DESC
LIMIT 5
Все это дело в цикле, где подставляется <айди раздела>. Я знаю что это жесть, но выбрать по человечески у меня не получается. Возможно ли решить эту задачу в один запрос?
Буду благодарен за правильное и скоростное решение.
Неактивен
Неактивен
vladislav написал:
Возможно ли решить эту задачу в один запрос?
Буду благодарен за правильное и скоростное решение.
Правильное и скоростное решение не всегда означает решение в один запрос.
Вы джойните таблицу комментариев ко всей таблице статей, считаете кол-во комментариев для всех статей, потом весь этот массив сортируете и оставляете только по 5 статей для каждого раздела. А если в разделах по 1000 статей? Это ужас сколько лишних вычислений, зато в один запрос.
Нужно сначала найти id нужных статей (5 последних из раздела), а уже потом считать для них комментарии и выбирать остальные поля из таблицы статей.
Неактивен
vasya написал:
Правильное и скоростное решение не всегда означает решение в один запрос.
Полностью согласен с вами.
Прочитав пост по ссылке и поэкспериментировав, у меня получилось одним запросом выбрать и разделы и по 5 статей и посчитать комментарии.
Стоит ли так делать? Или всё же лучше выбрать айдишки статей и уже потом считать комментарии через LEFT JOIN и WHERE id IN ? Что на Ваш взгляд будет быстрее?
А за ту конструкцию с переменными и условиями огромное спасибо. впервые вижу такое.
Неактивен
vladislav написал:
Стоит ли так делать? Или всё же лучше выбрать айдишки статей и уже потом считать комментарии через LEFT JOIN и WHERE id IN ? Что на Ваш взгляд будет быстрее?
При малом кол-ве статей разница не будет заметна. С ростом таблиц запрос, делающий джойн всей таблицы статей с комментариями, а потом сортировку этой кучи начнет тормозить.
Неактивен
Кстати, вашу задачку можно решить правильно и одним запросом
select .. from (выбираем id) as t join статьи join комментарии ..
Неактивен
Тогда получается:
1) берём id нужных статей
2) выбираем нужные поля статей и считаем комментарии.
примерно такой запрос:
SELECT <поля>, COUNT(c.id) AS tot_c FROM articles a LEFT JOIN comments c ON a.id = c.article_id
WHERE a.id IN (<айдишки статей>)
GROUP BY a.id
ORDER BY a.id DESC
В этом случае тоже будет джоинится вся таблица комментариев или только где article_id = списки айдишек?
Отредактированно vladislav (26.10.2010 03:53:50)
Неактивен
только где article_id = списки айдишек
Неактивен
Понял.
Тогда я думаю вопрос решён. Тему можно закрывать.
Огромное спасибо за помощь и оперативность.
Неактивен