Сведения о вопросе

Kirushaa

15:33, 12th August, 2020

Теги

MySQL    

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

Просмотров: 319   Ответов: 7

Сортировка внутри 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



  Сведения об ответе

SSESION

02:24, 14th August, 2020

нет, с подзапросом не то…
Да не вопрос:
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)


  Сведения об ответе

SEEYOU

02:20, 6th August, 2020

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

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


  Сведения об ответе

pumpa

18:48, 5th August, 2020

Я не эксперт в 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 уникален (во всяком случае внутри страны).


  Сведения об ответе

VERSUION

10:50, 29th August, 2020

можно использовать временную таблицу.
https://demiart.ru/forum/journal.php?user=1&comm=306504


  Сведения об ответе

FAriza

17:57, 6th August, 2020

  Сведения об ответе

fo_I_K

23:34, 21st August, 2020

решается self join'ом


  Сведения об ответе

prince

23:24, 4th August, 2020

Ваш запрос вообще не соответствует SQL-стандарту, и то, что он работает, особенность реализации MySQL.
Всё, что находится за пределами агрегатных функций, должно быть в GROUP BY.

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться