SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 25.11.2014 16:46:17

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Select с уникальным значением в зависимости от третьей колонки.

Добрый день.

Есть вот такая таблица:

id gruppa team points
1     A        t1     10
2     A        t2      9
3     B        t3      8
4     B        t4      7

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

Т.е. из примера в выборку должны попасть:

1 A t1 10
3 B t3 8

distinct не очень подходит, т.к. довольно часто нужно выбрать более, чем одну команду из группы. В принципе, довольно просто разобрать массив на php, но хотелось бы решить это средствами MySQL.

Т.е. нужно, чтобы срабатывало условие, что если у нас из группы А уже выбрана команда, то не смотря на то, что она идет следующей, мы ее пропускаем.

Отредактированно Bust_Ed (25.11.2014 16:49:04)

Неактивен

 

#2 25.11.2014 16:50:29

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

Re: Select с уникальным значением в зависимости от третьей колонки.


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

Неактивен

 

#3 25.11.2014 17:08:01

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Select с уникальным значением в зависимости от третьей колонки.

Убрал rand, в принципе подходит, но для одной команды из группы.

А если мне нужно выбрать больше, чем одну команду?

Неактивен

 

#4 25.11.2014 17:10:13

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

Re: Select с уникальным значением в зависимости от третьей колонки.


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

Неактивен

 

#5 25.11.2014 17:27:48

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Select с уникальным значением в зависимости от третьей колонки.

Спасибо. Теперь есть другая проблема. Нельзя ли переменные задать в запросе SELECT, а не отдельным запросом? Хотя, вроде, я где-то так делал. Пойду поищу.

Неактивен

 

#6 26.11.2014 08:24:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Select с уникальным значением в зависимости от третьей колонки.

Можно,
select * from table, (select @a:=0, @b:='') x;

но если вы внимательно прочитаете окончание http://sqlinfo.ru/forum/viewtopic.php?id=1742 то придете к выводу, что лучше будет сделать х простых запросов в цикле.

Неактивен

 

#7 26.11.2014 16:06:31

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Select с уникальным значением в зависимости от третьей колонки.

vasya написал:

Можно,
select * from table, (select @a:=0, @b:='') x;

но если вы внимательно прочитаете окончание http://sqlinfo.ru/forum/viewtopic.php?id=1742 то придете к выводу, что лучше будет сделать х простых запросов в цикле.

Вы не поверите, но я это еще вчера сделал. Проблема в том, что у меня этот запрос делается к временной таблице. И, я так понимаю из-за этого, возникает ошибка can't reopen table. Так что мне это не поможет, только переменные. Хотя этот способ более подходящий.

Неактивен

 

#8 26.11.2014 17:09:38

Bust_Ed
Завсегдатай
Откуда: Москва
Зарегистрирован: 13.11.2013
Сообщений: 48

Re: Select с уникальным значением в зависимости от третьей колонки.

SELECT *, CASE `group` WHEN 'A' THEN @a:=@a+1 WHEN 'B' THEN @b:=@b+1 END AS vars, @a, @b
                           FROM CurMatch, (select @a:=0, @b:=0) vrbls
                            WHERE `who` = 'M' AND `liga` = 2 AND @a<3 AND @b<3
                            ORDER BY `AvgPointsLost`+0.0 DESC, `sp`+0.0 DESC, `sm`+0.0 DESC

Не работает вообще, т.е. выводит все записи из таблицы (22, если быть точным).
SELECT *, CASE `group` WHEN 'A' THEN @a:=@a+1 WHEN 'B' THEN @b:=@b+1 END AS vars, @a, @b
                           FROM CurMatch, (select @a:=0, @b:=0) vrbls
                            WHERE `who` = 'M' AND `liga` = 2
                             HAVING @a<3 AND @b<3
                            ORDER BY `AvgPointsLost`+0.0 DESC, `sp`+0.0 DESC, `sm`+0.0 DESC


Выводит 5 записей, т.е. @a становится 3, и пока @b до 2 не докрутится - записи выводятся.

Такой вариант не помогает, похоже, тоже.

Неактивен

 

#9 27.11.2014 17:37:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Select с уникальным значением в зависимости от третьей колонки.

select .. from
(select t.*, if(gruppa='A', @a:=@a+1, @a) a, if(gruppa='B', @b:=@b+1, @b) b from `table` t, (select @a:=0, @b:=0) x order by points desc) t1
where a<N or b<M;

где N и M кол-во команд, которые нужно выбрать из соответствующей группы.

P.S. Если не сработает, то приводите исходные данные в виде create table .., insert into .. и нужного результата.

Неактивен

 

Board footer

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