SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 11.10.2011 17:39:21

svfolder
Участник
Зарегистрирован: 11.10.2011
Сообщений: 7

Выборка по максимальным значениям с группировкой

День добрый уважаемые форумчане.

Столкнулся с проблемой, хотя опыт вроде не малый.

Есть выборка из таблицы, эту выборку необходимо сгруппировать по id так чтобы после группировки остались только записи с максимальным pohval

вот запрос.

    SELECT
    p_concurs.ID as id,
    p_concurs.TITLE as title,
    p_photo.`NAME`,
    p_photo.pohval,
    p_photo.ID as id_photo
    FROM
    p_concurs
    Inner Join p_photo ON p_concurs.ID = p_photo.ID_CONCURS
    WHERE
    p_concurs.CLOSED = 0 AND
    p_photo.pohval > 0

получаем следующее

http://clip2net.com/clip/m70055/1318337727-clip-8kb.png?nocache=1


делаю следующий запрос для группировки

SELECT id, title, pohval, id_photo FROM (

    SELECT
    p_concurs.ID as id,
    p_concurs.TITLE as title,
    p_photo.`NAME`,
    p_photo.pohval,
    p_photo.ID as id_photo
    FROM
    p_concurs
    Inner Join p_photo ON p_concurs.ID = p_photo.ID_CONCURS
    WHERE
    p_concurs.CLOSED = 0 AND
    p_photo.pohval > 0

) x GROUP BY id


в итоге получаю

http://clip2net.com/clip/m70055/1318338942-clip-13kb.png?nocache=1

где 46 имеет не верное значение, оно выбрало первое попавшееся при группировке, а нужно то что с максимальным pohval

Отредактированно svfolder (11.10.2011 17:46:22)

Неактивен

 

#2 11.10.2011 18:06:14

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Выборка по максимальным значениям с группировкой

А если в первом запросе сделать групировку по ИД конкурса и выбрать MAX(p_photo.pohval) as pohval, он выдает правильный ИД фотографии?

Неактивен

 

#3 11.10.2011 18:09:05

svfolder
Участник
Зарегистрирован: 11.10.2011
Сообщений: 7

Re: Выборка по максимальным значениям с группировкой

К сожалению применение MAX с группировкой никак не выдаст правильный ID этой записи, проверял кучу раз, да он выдаст максимальный pohval для id но id_photo съедет.

Неактивен

 

#4 11.10.2011 18:11:45

svfolder
Участник
Зарегистрирован: 11.10.2011
Сообщений: 7

Re: Выборка по максимальным значениям с группировкой

до сих пор я делал подзапросы в цикле php и выяснял фотку с максимальным рейтингом но это не дает мне покоя. должно же быть решение...

Неактивен

 

#5 11.10.2011 23:49:57

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Выборка по максимальным значениям с группировкой

Посмотрите вот этот топик.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 12.10.2011 10:30:45

svfolder
Участник
Зарегистрирован: 11.10.2011
Сообщений: 7

Re: Выборка по максимальным значениям с группировкой

deadka написал:

Посмотрите вот этот топик.

Посмотрел, но к сожалению не могу пока понять суть того как оно там работает и мне нужны все 3 поля (id, pohval, id_photo) а не 2

Отредактированно svfolder (12.10.2011 10:31:58)

Неактивен

 

#7 12.10.2011 10:42:04

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Выборка по максимальным значениям с группировкой

Там тоже нужны три поля - id, login и time wink. Идея состоит в том, что выбирается пара из id/максимальный элемент, а потом уже на нее извлекается соответствующий элемент третьей колонки.

Приведите дамп ваших таблиц (структуру в виде create table и сами данные (в виде insert into...)).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 12.10.2011 10:58:26

svfolder
Участник
Зарегистрирован: 11.10.2011
Сообщений: 7

Re: Выборка по максимальным значениям с группировкой

deadka написал:

Там тоже нужны три поля - id, login и time wink. Идея состоит в том, что выбирается пара из id/максимальный элемент, а потом уже на нее извлекается соответствующий элемент третьей колонки.

Приведите дамп ваших таблиц (структуру в виде create table и сами данные (в виде insert into...)).

а чем выборка первой фото не подходит?
не вижу смысла приводить дамп на 10 000 записей фоток, у нас же есть уже выборка запросом, предположим это уже таблица с данными, суть вопроса не меняется.
Прикрепил дамп тестовой таблицы


Прикрепленные файлы:
Attachment Icon test.sql, Размер: 1,778 байт, Скачано: 773

Неактивен

 

#9 12.10.2011 11:39:41

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Выборка по максимальным значениям с группировкой

Да, конечно тестовая таблица с результатом внешнего запроса подойдёт.

1-й mysql-способ решения:

select t2.* from (SELECT `id`, max(`pohval`) AS `pohval` FROM `t_4794` GROUP BY `id`) t1 JOIN `t_4794` t2 USING(id,pohval) ORDER BY t1.id;


Ну и ключик на (id,pohval) создайте.

Способ имеет маленький недостаток, он опирается на уникальность пары id,pohval. То есть если на одно фото попадётся две оценки с одинаковой степенью похвалы, то выборка выведет оба. Для иллюстрации добавьте еще одну запись в тестовую таблицу:
insert into t_4794 values(43,'Сибирячки',3,17344);


Самое лучше по производительности решение - отфильтровать это уже на клиенте (в Вашем случае - php).
Если сильно хочется средствами mysql -
select t2.* from (SELECT `id`, max(`pohval`) AS `pohval` FROM `t_4794` GROUP BY `id`) t1 JOIN `t_4794` t2 USING(id,pohval) GROUP BY id,pohval ORDER BY t1.id;


2) С помощью пользовательских переменных (но вообще так делать не очень следует)

set @i=0,@n=1,@l=0; select t.* from ( select * from t_4794 order by id, pohval desc) t where if (@l=id, @i:=@i+1,(@i:=0) or (@l:=id)) and @i<@n;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson