Автор Тема: [mysql] Запрос с сортировкой  (Прочитано 10878 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн shred

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« : 04 Октября 2003, 19:39:58 »
Имеем: таблица с участниками (id, nick) и таблица с результатами заездов этих участников (id, nick_id, time, action_date, где time - за какое время доехал, action_date - дата, когда это было).

Требуется: что-то вроде "Топ 10 ездаков", со строками вида "time | nick | action_date", nick\'и, конечно, повторяться не должны, сортировка по time, меньшее впереди.

Если пишем
select * from участниками у, результаты р
where у.id=р.nick_id
group by у.id

избавляемся от повторов ников, но и теряем нужную запись (с лучшим временем), вместо нее - произвольная.
Если писать group by р.time asc, у.id вылазят записи о всех заездах. В сущности, все ок, только не знаю как повторяющиеся ники убрать.

Вот если бы можно было сначала отсортировать, а потом с помощью group by у.id отстрелить дубли :) Но порядок group by, order by и т.д. строго определен...

Как быть?

Оффлайн madone

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 7
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #1 : 05 Октября 2003, 09:49:50 »
Попробуй вставить ключевое слово DISTINCT

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #2 : 05 Октября 2003, 10:24:44 »
сначала написал а потом только подумал.
прошу прощения.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #3 : 05 Октября 2003, 10:29:14 »
если запраршивать min(time), то время не пропадет.

Оффлайн shred

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #4 : 05 Октября 2003, 19:30:18 »
Цитировать
если запраршивать min(time), то время не пропадет.

Я так и делаю :) НО! Если при этом выводить и дату, то она не соответствует нику и результату заезда (ник, как ни странно, соответствует результату).

Цитировать
Попробуй вставить ключевое слово DISTINCT

Пробовал, эффекта не добился. Может как-то не так пробовал, но вариант, вроде всего один.

ЗЫ. mysql v4.0.15

Оффлайн shred

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #5 : 05 Октября 2003, 19:42:32 »
И вообще, group by ведет себя не совсем однозначно. Если писать group by поле - отстреливает дубликаты, если group by поле, поле, поле наворочено и удобно сортирует. Полагаю так и должно быть :)

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #6 : 05 Октября 2003, 20:03:30 »
> Если при этом выводить и дату, то она не соответствует нику и результату заезда (ник, как ни странно, соответствует результату)

оно берет первое попавшееся значение для каждого y.id.

Одним запросом не сделаешь. Сначала выбираешь все значения id и минимального, а потом соответсвующие этим значениям остальные данные.
На Машине Тьюринга далеко не уедешь.

Оффлайн shred

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #7 : 05 Октября 2003, 21:44:12 »
Интересно, а не в mysql\'e это можно было бы сделать одним запросом? (скажем в pgSQL)

Оффлайн fidget

  • Непоседа
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 607
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #8 : 06 Октября 2003, 10:57:38 »
Все зависит от того как в других СУБД реализована выборка при GROUP BY, т.е возвращаются ли там данные соответствующие минимальному значению или нет. Этот момент в стандарте SQL не описан, потому каждая СУБД реализует так как ей удобно.

Даже в том-же MySQL начиная с версии 4.1 это можно одним запросом реализовать, но не раньше.
На Машине Тьюринга далеко не уедешь.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #9 : 06 Октября 2003, 11:36:39 »
В принципе, можно и одним запросом, поскольку проблема только в уникальности участников.
То есть, сделать примитивнийший запрос, который выбирает заезды сортируя по времени, и джойня имя игрока. Естественно, без лимита, или с запасом - скажем, 100.
И выводить, запоминая тех, кто уже был.
Криво, но зато просто :-)

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
[mysql] Запрос с сортировкой
« Ответ #10 : 07 Октября 2003, 09:21:03 »
select y.nick, y.id, MAX(p.time), p.action_date
from участниками у INNER JOIN результаты р ON у.id=р.nick_id
group by у.id, p.action_date DESC
LIMIT 10
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн shred

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #11 : 07 Октября 2003, 10:34:56 »
Alexandr:

"INNER JOIN and , (comma) are semantically equivalent. Both do a full join between the tables used."
Эт тоже самое, что и from участниками у, результаты р where у.id=р.nick_id. На всякий случай я попробовал - не то.
« Последнее редактирование: 07 Октября 2003, 10:51:03 от shred »

Оффлайн Alexandr

  • Фанат форума
  • Ветеран
  • *****
  • Сообщений: 865
  • +0/-0
  • 0
    • Просмотр профиля
    • http://gtp.hobi.ru
[mysql] Запрос с сортировкой
« Ответ #12 : 07 Октября 2003, 15:12:43 »
Цитировать
shred:
Эт тоже самое, что и

ага
Цитировать
shred:
На всякий случай я попробовал - не то.

Что не то?
Выборка не та? Тогда я не понял что тебе вообще надо...
Объясни толково.
Kiss my CSS
Pусские gtp gp3 ( midi + tab ) -   - Все для Авто.

Оффлайн shred

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #13 : 07 Октября 2003, 19:52:01 »
Поясняю: надо среди результатов каждого участника найти лучший и представить лучшие результаты участников в табличке, самые лучшие результаты - вверху; поля: результат (время), ник, дата (когда это свершилось). Одним запросом. В mysql\'e.

Оффлайн shred

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 8
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
[mysql] Запрос с сортировкой
« Ответ #14 : 07 Октября 2003, 20:10:03 »
Думаю сработало бы, что-нить вроде этого:

select р.time, у.nick, р.action_date from участниками у, результаты р
where у.id=р.nick_id and у.id = (
select distinct р.nick_id
from результаты р
order by р.time)


Но подзапросов в mysql\'e пока нет :(

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28