@Richard_Ferlow
Веб-программист

Как сделать выборку строк с наименьшей ценой, сгруппированных по полю и после отсортировать по дате?

Есть таблица mysql, там хранятся туры

id - date - nights - country - price

date сейчас - varchar 255 вида 11.09.2014 (данные именно в таком формате, подозреваю что формат ячейки нужно сменить, но не знаю на какой)
country - varchar 255 - Вьетнам
price - int 11 11683
nights - int11

поле в таблице значительно больше конечно, упомянул только основные

Соответственно в таблице хранятся много наборов туров в разные страны.

Задача - получить минимальные предложения по этой стране и чтобы эти предложения были отсортированы по дате вылета

Мне в голову пришло, что нужно сделать GROUP by country ORDER by price ASC , так как насколько знаю GROUP by выберет первые встретившиеся строки, которые имеют одинаковую страну, а так как сортировка уже есть по price то с наименьшей ценой строка будет. Возможно, я ошибаюсь.

Однако как данные уже этой выборки отсортировать по date не совсем понимаю. Нужно вложенный запрос делать?
  • Вопрос задан
  • 2467 просмотров
Пригласить эксперта
Ответы на вопрос 3
@mind3
Не совсем правильно вы поняли Group by, скорее Вам лучше использовать Where country="Вьетнам" и Order by по двум полям price asc, date desc . Ну и лимит конечно же, сколько записей таких вам нужно. "date сейчас - varchar 255 вида 11.09.2014" - однозначно менять нужно на DateTime, ведь нужно знать не только дату, но и время вылета. p.s. Создайте резервную копию таблицы перед тем как делать такие изменения.
Ответ написан
@XPyCTang
Чтобы получить сортировку по двум полям надо просто их перечислить через запятую, например так:
ORDER BY date DESC, price ASC - причем сортировка сначала будет по date, а потом по price, т.е.:
date / price
28.09 / 1000
28.09 / 1200
27.09 / 1000
А проблема тут в группировке... Дело в том, что группировка происходит раньше сортировки, поэтому получишь, те поля которые первые попадутся при группировке (в зависимости от дефолтовой сортировки, обычно по id)
Есть вариант попробовать такой запрос:
SELECT DISTINCT
   country,
   date,
   price
FROM
   Table
ORDER BY
   date DESC,
   price
Ответ написан
Kwisatz
@Kwisatz
Больше web-приложений, хороших и разных
Для начала добавляем полы даты
alter table tour_table add departure_date date not null;

Затем скриптом берем ваш варчар и заталкивает в поле departure_date в формате YYYY-MM-DD
Что есть минимальные предложения? Если просто сортировка по цене, тогда
select some_field from from tour_table where country='Вьетнам' order by price asc,departure_date desc

Если нужна цена по определенному попрогу, то
select some_field from from tour_table where country='Вьетнам' and price<=100000 order by price asc,departure_date desc

Поле даты нужно переформатировать обязательно, в текущем виде сортировка по варчару не даст того что вы хотите, можно сделать процедуру или при загрузке правильно дату втыкать.
Кстати, запрос видимо будете делать часто, посему советую добавить индекс:
alter table tour_table add key main_key(country, price, departure_date)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы