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

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

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

Вы не зашли.

#1 10.05.2011 17:44:03

sigmov
Участник
Зарегистрирован: 17.03.2011
Сообщений: 3

MySql и MAX из элементов, а не в столбце

Есть така задача. - для таблицы(T) из 2х столбцов (a и b) получить максимальное значение в каждой строке.

SELECT IF(a>b,a,b) as maxvalue FROM T


Та же задача с 5 столбцами (a,b,c,d,e). Использование IF становиться отнюдь не тривиальным. (((((
Нет ли какой нить встроенной функции, которая бы мне помогла?

Неактивен

 

#2 10.05.2011 17:51:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: MySql и MAX из элементов, а не в столбце

Можно сделать через IF.

SELECT v FROM (SELECT @t1:=IF(a>b,a,b), @t2:=IF(c>d,c,d), @t3:=IF(@t2>@t1,@t2,@t1), IF(e>@t3,e,@t3) AS v FROM T) AS t1;

Неактивен

 

#3 10.05.2011 19:00:19

simple
Активист
Зарегистрирован: 25.11.2010
Сообщений: 168

Re: MySql и MAX из элементов, а не в столбце


SELECT GREATEST(a,b,c,d,e,...n) FROM T;
 

Неактивен

 

#4 11.05.2011 20:45:46

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

Re: MySql и MAX из элементов, а не в столбце

rgbeast написал:

Можно сделать через IF.

SELECT v FROM (SELECT @t1:=IF(a>b,a,b), @t2:=IF(c>d,c,d), @t3:=IF(@t2>@t1,@t2,@t1), IF(e>@t3,e,@t3) AS v FROM T) AS t1;

На таком тесте проходит только со второй попытки:

mysql> create table t_4235(a int, b int ,c int,d int,e int);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_4235 values(10,8,7,9,6);
Query OK, 1 row affected (0.00 sec)

mysql> SELECT v FROM (SELECT @t1:=IF(a>b,a,b), @t2:=IF(c>d,c,d), @t3:=IF(@t2>@t1,@t2,@t1), IF(e>@t3,e,@t3) AS v FROM t_4235) AS t1;
+------+
| v    |
+------+
| 9    |
+------+
1 row in set (0.00 sec)

mysql> SELECT v FROM (SELECT @t1:=IF(a>b,a,b), @t2:=IF(c>d,c,d), @t3:=IF(@t2>@t1,@t2,@t1), IF(e>@t3,e,@t3) AS v FROM t_4235) AS t1;
+------+
| v    |
+------+
| 10   |
+------+
1 row in set (0.00 sec)

В то же время, если инициализировать ПП заранее (перед запросом, тем самым задав тип), то нормально.

mysql> create table t_4235(a int, b int ,c int,d int,e int);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t_4235 values(10,8,7,9,6);
Query OK, 1 row affected (0.00 sec)

mysql> set @t1=0,@t2=0,@t3=0;SELECT v FROM (SELECT @t1:=IF(a>b,a,b), @t2:=IF(c>d,c,d), @t3:=IF(@t2>@t1,@t2,@t1), IF(e>@t3,e,@t3) AS v FROM t_4235) AS t1;
Query OK, 0 rows affected (0.00 sec)

+------+
| v    |
+------+
|   10 |
+------+
1 row in set (0.00 sec)


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

Неактивен

 

#5 07.06.2011 22:07:20

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

Re: MySql и MAX из элементов, а не в столбце

На dev.mysql.com отписали вот что.

Так что нужно определить тип переменной до запроса.

SET @t1=0,@t2=0,@t3=0;SELECT v FROM (SELECT @t1:=IF(a>b,a,b), @t2:=IF(c>d,c,d), @t3:=IF(@t2>@t1,@t2,@t1), IF(e>@t3,e,@t3) AS v FROM T) AS t1;

Отредактированно deadka (07.06.2011 22:07:49)


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

Неактивен

 

Board footer

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