Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Здравствуйте, такой вопрос:
таблица, по мимо всего остального, содержит поля `rating` и `one_result_id`.
в запросе я использую конструкцию "GROUP BY `one_result_id`", т.е. собираю в группу все строки, с одинаковым `one_result_id`.
При этом я хочу каким-либо образом из этой группы выделить ту строку, в которой `rating` среди всех элементов одной группы максимален.
Да, я могу узнать этот рейтинг использовав
"SELECT MAX(*) ..."
но все остальные данные строки выбираются первые попавшие, а мне по мимо рейтинга нужно всё остальное.
Подскажите, возможно ли решить данную проблему минимальным количеством запросов?
Комментарий модератора.
В статье Выбрать последнюю строку из группы приведено 5 вариантов решения в один запрос.
Неактивен
Отредактированно Magz (04.05.2009 17:22:10)
Неактивен
Забыл сказать, требования к данному запросу по времени ОЧЕНЬ критичные. Записей около 250к, присутствует условие WHERE поиска по полю VARCHAR (Это не относится к делу, но поясняет важность скорости).
На сколько я понимаю Ваш запрос вначале выбирает все максимальные рейтинги из таблицы, где one_result_id совпадают. А затем все строки. И сортирует их по рейтингу.
Вообщем хорошо, но есть два минуса:
1) По времени выполнения из за подзапроса будет долгим
2) Он из группы с совпадающими one_result_id выбирает все, а мне хотелось бы только одну строку из группы, в которой rating максимален.
Спасибо
Неактивен
К сожалению, стандартный SQL такую задачу «в лоб» решать не умеет. Обычно применяют всякие
хитрости и приемы (например, как написал Magz). Если Вам очень нужен быстрый запрос, то можно
пойти на денормализацию. Возможно, в Вашем случае окажется достаточно быстрым что-то типа
SELECT one_result_id, (SELECT ... FROM tablename WHERE one_result_id=x.one_result_id ORDER BY rating DESC LIMIT 1)
FROM tablename x
Неактивен
К сожалению такой запрос выполняется сравнительно очень долго. На данный момент на практике использую такой метод:
Выбираю все подходящие под условие данные и обрабатываю их уже внутри кода. Главное – быстрый запрос.
Жаль, что SQL не позволяет выбрать определенную строку из группы. Попробую использовать денормализацию, как Вы посоветовали.
В любом случае Спасибо!
Неактивен
При наличии ключика на (one_result_id, rating) он должен выполняться очень-очень быстро
Неактивен
Сделал составной индекс (one_result_id, rating). Использую MySQL. 30к записей на локалке. Запрос получился такой:
Отредактированно Armalon (05.05.2009 15:08:17)
Неактивен
подозреваю, что запрос
SELECT one_result_id
FROM `search_suggestion` x WHERE ...
у Вас при этом выполняется 1.7000 sec. Правда?
Неактивен
Как раз нет. Всего 0.0040 sec. Что меня и настораживало...
Нашел в чем проблема:
у меня в БД из 30к записей только где-то у 4к присутствовал one_result_id!=0. для всех остальных он был нулевой. когда добавил условие "one_result_id>0" в главном запросе, то стало работать напорядок быстрее (~0.0056), что вообщем очень хорошо
Сейчас буду проводить тесты производительности и удобства данного метода. Спасибо еще раз
Неактивен
Страниц: 1