Задавайте вопросы, мы ответим
Вы не зашли.
Есть задача. Таблица с данными о заездах.
Заезд содержит информацию о водителе, времени, и километраже.
Необходимо получить результат ввиде (по одному) лучшему результату на каждого водителя.
Лучшим результатом считается максимальное расстояние, пройдённое за самое меньшее время.
Набросал запрос:
Отредактированно binarius (21.07.2010 17:00:14)
Неактивен
MAX(km / (finish - start)), lid GROUP BY lid?
Неактивен
может так?
SELECT
a.lid,
a.km,
min(a.finish-a.start) as min_time
FROM es_arrival a
INNER JOIN (select lid,max(km) as km_max from es_arrival where cid=1 group by lid) a_max
ON a.lid=a_max.lid and a.km=a_max.km_max
WHERE
a.cid=1
GROUP BY
a.lid,a.km
Неактивен
2 проблемы возникли:
1. Пытаюсь добавить полей в выборку в начале запроса - добавляются поля из других записей почему то.
2. Как оптимизировать данный запрос, а то сплошной filesort.
Неактивен
Я может не понимаю очевидного? Но если сделать SELECT a.id, ... - запрос выбирает ID первый попавшийся... а не тот, что нужен. И так по всем полям. Первые попавшие под условие.
Сотню раз перепроверил, ID выдаёт как будто сортируя по ASC.
Совсем тупею?
Отредактированно binarius (22.07.2010 01:04:48)
Неактивен
Если вы группируете не по всем полям, то Вы сами себе ставите палки в колеса.
Другие СУБД бы просто выдали ошибку, а MySQL пытается быть максимально
лояльным с пользователем. Но он правда не знает, какую строку выбрать при
группировке — выбирает любую.
Либо вы делаете несколько запросов для каждого пользователя с правильным
ORDER BY LIMIT 1, либо Вы достаете максимальные значения и пользователей,
а остальные данные получаете присоединением (JOIN) основной таблицы по
вот этим коротким группировочным данным.
И оптимизировать не получится, т.к. Вы делаете MAX(a - b), что не позволит
использовать индекс никогда. Подсказка: если хранить не «a и b», а «а и b-a»,
то информацию Вы не теряете, а вот на этом запросе сможете немного выиграть.
Неактивен
Хм насчет оптимизации понял. В принципе эти запросы редки и сразу в кеш положить уже готовую страницу не проблема, ибо она обновляется минимум раз в сутки.
А насчет группировки - я пытался туда добавлять поля, появлялись лишние строки. Не понял почему. Начинали присутствовать строки, которые нужны и побочные... или тут имеет разницу порядок группировки, также как и в ORDER BY?
Отредактированно binarius (22.07.2010 13:51:38)
Неактивен
Поигрался с группировкой, порядком полей. Делал все возможные комбинации с простым добавлением просто ещё выборки ID записи, однако к каждой строке вылезает одна побочная.
Может дамп в студию маленький выкатить?
Неактивен
Если Вы сгруппируете по всем полям, то получите DISTINCT, от которого
Вы пытаетесь уйти Группировать надо по тем полям, которые должны
быть по смыслу. По остальным полям нужно (SHOULD в понимании RFC)
писать групповые функции или смириться с тем, что там будет возвращено
произвольное значение из диапазона.
Неактивен
Блин вот тробл. Ну мне надо всего лишь ID вытащить помимо того, что есть. А по ID я уже другими запросами всё возьму... Ладно даже фиг ты с ними с побочными данными, может тогда проще озаботиться фильтрацией не нужного? Если да, то тогда вопрос, что лучше - использовать средства MySQL или PHP.
Неактивен
Определитесь, что есть лучшее расстояние. Если то, что Вы написали, то надо
искать строку с MAX( km / ( stop - start )). Вы же предпочитаете вариант
максимального расстояния (а при равных расстояниях — минимального времени).
После этого Вы сможете составить запрос, который будет отвечать на вопрос
«найди всех гонщиков, и их максимальную характеристику». После этого Вы
сможете составить запрос, который будет отвечать на вопрос «Найди всех гонщиков,
у которых вот такая максимальная характеристика».
Да, нужно писать или несколько подзапросов, или несколько независимых запросов.
Да, индексы использоваться в последнем случае не будут, если характеристика
состоит из более, чем одного поля.
Неактивен
Попробывал:
Неактивен
Неактивен
Пошел по пути денормализации, добавил поле time, которое содержит finish-start, может тут легче что-то придумать?
Неактивен
Ух сделал я это драконьим ORDER BY LIMIT 0,1 с двумя доп.запросами. Зато работает.
Тема исчерпана, всем спасибо!
Неактивен