SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.10.2010 02:20:26

vladislav
Участник
Зарегистрирован: 26.10.2010
Сообщений: 17

Помогите с выборкой данных

Доброго времени суток!

Имеется две таблицы:

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

Все это дело в цикле, где подставляется <айди раздела>. Я знаю что это жесть, но выбрать по человечески у меня не получается. Возможно ли решить эту задачу в один запрос?

Буду благодарен за правильное и скоростное решение.

Неактивен

 

#2 26.10.2010 02:25:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с выборкой данных

Неактивен

 

#3 26.10.2010 02:41:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с выборкой данных

vladislav написал:

Возможно ли решить эту задачу в один запрос?

Буду благодарен за правильное и скоростное решение.

Правильное и скоростное решение не всегда означает решение в один запрос.
Вы джойните таблицу комментариев ко всей таблице статей, считаете кол-во комментариев для всех статей, потом весь этот массив сортируете и оставляете только по 5 статей для каждого раздела. А если в разделах по 1000 статей? Это ужас сколько лишних вычислений, зато в один запрос.

Нужно сначала найти id нужных статей (5 последних из раздела), а уже потом считать для них комментарии и выбирать остальные поля из таблицы статей.

Неактивен

 

#4 26.10.2010 03:22:29

vladislav
Участник
Зарегистрирован: 26.10.2010
Сообщений: 17

Re: Помогите с выборкой данных

vasya написал:

Правильное и скоростное решение не всегда означает решение в один запрос.

Полностью согласен с вами.

Прочитав пост по ссылке и поэкспериментировав, у меня получилось одним запросом выбрать и разделы и по 5 статей и посчитать комментарии. smile

Стоит ли так делать? Или всё же лучше выбрать айдишки статей и уже потом считать комментарии через LEFT JOIN и WHERE id IN ? Что на Ваш взгляд будет быстрее?

А за ту конструкцию с переменными и условиями огромное спасибо. впервые вижу такое.

Неактивен

 

#5 26.10.2010 03:38:01

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с выборкой данных

vladislav написал:

Стоит ли так делать? Или всё же лучше выбрать айдишки статей и уже потом считать комментарии через LEFT JOIN и WHERE id IN ? Что на Ваш взгляд будет быстрее?

При малом кол-ве статей разница не будет заметна. С ростом таблиц запрос, делающий джойн всей таблицы статей с комментариями, а потом сортировку этой кучи начнет тормозить.

Неактивен

 

#6 26.10.2010 03:50:49

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с выборкой данных

Кстати, вашу задачку можно решить правильно и одним запросомwink

select .. from (выбираем id) as t join статьи join комментарии ..

Неактивен

 

#7 26.10.2010 03:53:09

vladislav
Участник
Зарегистрирован: 26.10.2010
Сообщений: 17

Re: Помогите с выборкой данных

Тогда получается:
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)

Неактивен

 

#8 26.10.2010 03:59:45

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите с выборкой данных

только где article_id = списки айдишек

Неактивен

 

#9 26.10.2010 04:02:57

vladislav
Участник
Зарегистрирован: 26.10.2010
Сообщений: 17

Re: Помогите с выборкой данных

Понял.

Тогда я думаю вопрос решён. Тему можно закрывать.

Огромное спасибо за помощь и оперативность.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson