Как сортировать внутри GROUP BY?

Сортировка внутри GROUP BY


CREATE TABLE `oper` (

`id_num` int(10) unsigned NOT NULL auto_increment,

`id_country` int(10) unsigned NOT NULL,

`cost` decimal(4,2) unsigned NOT NULL default '0.00',

PRIMARY KEY (`id_num`)

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

id_num id_country cost

1 1 1

2 1 2

3 1 3

4 1 4

5 2 5

6 2 6

7 2 7

8 2 8


надо выбрать самые дорогие номера по странам и их ид

select id_num, id_country, max(cost) from oper group by id_country

выдает вот такую штуку

id_num id_country max(cost)

1 1 4

5 2 8


тоесть цены выбирает верные, но ид номера никак не соответствует ценнику, должно быть так

id_num id_country max(cost)

4 1 4

8 2 8
  • Вопрос задан
  • 12780 просмотров
Решения вопроса 1
DevMan
@DevMan
нет, с подзапросом не то…
Да не вопрос:
SELECT o.*
    FROM oper AS o
        JOIN oper AS o2
    ON o.id_country = o2.id_country
        GROUP BY o.id_country, o.id_num
        HAVING o.cost = MAX(o2.cost)
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
>тоесть цены выбирает верные, но ид номера никак не соответствует ценнику, должно быть так

Собственно по другому и не должно быть — группируете по стране, выбираете максимальную цену и выводите «рандомный» номер, нигде не указывая, что он должен соответствовать этой цене. Так или иначе нужно сначала получить максимальное значение, а потом номер для него.
Ответ написан
Комментировать
@MikhailEdoshin
Я не эксперт в SQL, но в sqlite, например, это будет примерно так:

  SELECT *
    FROM oper o
   WHERE cost = (
         SELECT MAX(cost)
           FROM oper p
          WHERE p.id_country IS o.id_country)
ORDER BY id_country;

Предполагается, что cost уникален (во всяком случае внутри страны).
Ответ написан
Thelema
@Thelema
можно использовать временную таблицу.
https://demiart.ru/forum/journal.php?user=1&comm=306504
Ответ написан
Комментировать
sHinE
@sHinE
веб-разработчик, php/js/mysql и сопутствующее
mgyk
@mgyk
решается self join'ом
Ответ написан
Комментировать
FloppyFormator
@FloppyFormator
Ваш запрос вообще не соответствует SQL-стандарту, и то, что он работает, особенность реализации MySQL.
Всё, что находится за пределами агрегатных функций, должно быть в GROUP BY.

Задачу можно решить через подзапрос, self-join или кастомную агрегатную функцию наподобие ARGMAX.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы