SQL, выбрать все записи с максимальным значением

humbert
На сайте с 16.03.2006
Offline
527
27972

Есть БД, в ней поля P1, P2, P3 и записи:

X1, 1, 4

X1, 2, 5
X2, 5, 1
X2, 6, 4
X3, 8, 2
X4, 9, 1
X3, 7, 3
X1, 3, 3
X2, 4, 5

Надо выбрать записи, где второе поле (P2) имеет максимальное значение

Пробовал так:

Select P1, max(P2) From table1 group by P1
- работет.

Но нужны и данные P3, а если делать так

Select P1, max(P2), P3 From table1 group by P1

не работает, первые два поля верное значение, а P3 выводит совсем не то

Парсинг прайс-листов, наполнение интернет-магазина товаром. (https://humbert.ru) Любая CMS (Битрикс, OpenCart, Prestashop и даже Woo Commerce )
edogs software
На сайте с 15.12.2005
Offline
775
#1

Элементы в группе имеют случайный порядок. Поэтому для P3 выводится случайное значение из группы с одинаковым P1.

Есть "типа хак" для такой выборки, делайте нечто вроде

select p1, max(concat_ws('~',p2,p3)) from table1 group by p1

и потом разбирайте результат на php - простым explode по ~. В таком случае у Вас получится что к p2 прицепится именно правильный p3, т.к. конкатятся они с учетом строк где находятся.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
humbert
На сайте с 16.03.2006
Offline
527
#2

То что нужно, огромное спасибо

P.s. не то, там сравнение по всей строке concat_ws('~',p2,p3) происходит, т.е. 47~6 будет больше чем 327~2

K
На сайте с 28.12.2008
Offline
61
kud
#3

humbert,


Select P3,P1, max(P2) FROM table1 WHERE P2 IN (Select max(P2) FROM table1 GROUP BY P1 ) GROUP BY P1

?

Polimer
На сайте с 01.09.2006
Offline
84
#4

Лень догадываться, что у Вас за СУБД - из вопроса не видно.

В общем случае, один из вариантов решения такой задачи можно искать вот в этом направлении:

SELECT t1.P1, t1.P2, t1.P3 FROM MyTable t1

INNER JOIN (SELECT P1, MAX(P2) AS maxP2 FROM MyTable GROUP BY P1) t2
ON (t2.P1 = t1.P1 and t2.maxP2 = t1.P2)
Программные решения для бизнеса. (http://frontsoft.ru/) На заказ. Дорого.
humbert
На сайте с 16.03.2006
Offline
527
#5

kud, работает, долго только. Надо с индексами поработать.

K
На сайте с 28.12.2008
Offline
61
kud
#6

humbert,

можно еще немного упростить, в начале запроса:

Select P3,P1, P2

То есть, P2 вместо MAX(P2)

edogs software
На сайте с 15.12.2005
Offline
775
#7
humbert:
То что нужно, огромное спасибо

P.s. не то, там сравнение по всей строке concat_ws('~',p2,p3) происходит, т.е. 47~6 будет больше чем 327~2

Если оба числовых, то скорее всего поможет

SELECT p1, max( p2 *100000000000000 + p3 ) FROM table1 GROUP BY p1 

Плюсы тут в том, что нет джоинов лишних:-\ Разбирать результат ничуть не сложнее.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий