SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 12.03.2012 16:00:53

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

MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Пришла мне в голову идея обойти этот момент с помощью пользовательских переменных.
Проблема усугублялась тем, что подзапрос в in выполняется для каждой строки внешнего запроса. В общем, писал невдолбенные конструкции, в которых сам уже путался, но забороть не получилось.
В конечном счете простым решением оказался вложенный подзапрос.

create table t1 (c1 int);
create table t2 (c2 int);
insert into t1 values(1),(2),(3);
insert into t2 values(2),(4),(5);

select t1.* from t1 where c1 in (select c2 from t2 order by c2 asc limit 1);
ERROR 1235 (42000): This version of MySQL doesnot yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

select t1.* from t1 where c1 in (select * from (select c2 from t2 order by c2 asc limit 1) t);
+------+
| c1   |
+------+
|    2 |
+------+
1 row in set (0.00 sec)

Неактивен

 

#2 12.03.2012 18:04:39

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

Re: MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

Есть еще решение - заменить IN на JOIN с нужным подзапросом.

Неактивен

 

#3 12.03.2012 19:49:29

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

Re: MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

JOIN это стандартное решение, я хотел найти другое.
Кстати, такой подход (вложенный подзапрос) позволяет обойти ограничение на невозможность одновременного обновления таблицы и выборки из неё в подзапросе.

Неактивен

 

#4 12.03.2012 20:26:56

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

Re: MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

vasya написал:

Кстати, такой подход (вложенный подзапрос) позволяет обойти ограничение на невозможность одновременного обновления таблицы и выборки из неё в подзапросе.

Это наверное бага - теряется смысл самого ограничения, если так можно.

Насчет переменных - сделать с помощью них LIMIT нельзя без JOIN или еще одного вложенного подзапроса. А если есть JOIN или поздзапрос, то тогда уже есть решение проблемы.

Неактивен

 

#5 12.03.2012 21:34:17

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

Re: MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

rgbeast написал:

vasya написал:

Кстати, такой подход (вложенный подзапрос) позволяет обойти ограничение на невозможность одновременного обновления таблицы и выборки из неё в подзапросе.

Это наверное бага - теряется смысл самого ограничения, если так можно.

Нет, при этом подзапрос переходит в часть from и материализуется во временную таблицу.
UPDATE t ... WHERE col = (SELECT * FROM (SELECT ... FROM t...) AS _t ...);
Here the result from the subquery in the FROM clause is stored as a temporary table, so the relevant rows in t have already been selected by the time the update to t takes place.

http://dev.mysql.com/doc/refman/5.5/en/ … tions.html


rgbeast написал:

Насчет переменных - сделать с помощью них LIMIT нельзя без JOIN или еще одного вложенного подзапроса. А если есть JOIN или поздзапрос, то тогда уже есть решение проблемы.

Была мысль сделать функциональность limit через условие в where, но не получилось.

Неактивен

 

#6 12.03.2012 23:10:12

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

Re: MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

vasya написал:

Была мысль сделать функциональность limit через условие в where, но не получилось.

Есть такая дикая идея, но в подзапрос это не встраивается.

SET @cnt=0;select c2 from t2 where (select @cnt:=@cnt+1)<2 order by c2 asc;

Неактивен

 

#7 12.03.2012 23:42:28

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

rgbeast написал:

vasya написал:

Была мысль сделать функциональность limit через условие в where, но не получилось.

Есть такая дикая идея, но в подзапрос это не встраивается.

SET @cnt=0;select c2 from t2 where (select @cnt:=@cnt+1)<2 order by c2 asc;

Почему не встраивается ?
У меня вот получился такой вариант.

select t1.* from t1 where c1 in (
    select c2 from t2,(select @а:=0) s where if(@а=0,@а:=1,0)
);
 

Неактивен

 

#8 13.03.2012 00:48:45

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

Re: MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

У меня не работает - возвращает пустое множество (MySQL 5.1.52)

mysql> SET @a=0; select t1.* from t1 where c1 in (     select c2 from t2,(select @a:=0) s where if(@a=0,@a:=1,0) );
Query OK, 0 rows affected (0.00 sec)

Empty set (0.00 sec)

mysql> explain select t1.* from t1 where c1 in (     select c2 from t2,(select @a:=0) s where if(@a=0,@a:=1,0) );
+----+--------------------+------------+--------+---------------+------+---------+------+------+----------------+
| id | select_type        | table      | type   | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+--------------------+------------+--------+---------------+------+---------+------+------+----------------+
|  1 | PRIMARY            | t1         | ALL    | NULL          | NULL | NULL    | NULL |    3 | Using where    |
|  2 | DEPENDENT SUBQUERY | <derived3> | system | NULL          | NULL | NULL    | NULL |    1 |                |
|  2 | DEPENDENT SUBQUERY | t2         | ALL    | NULL          | NULL | NULL    | NULL |    3 | Using where    |
|  3 | DERIVED            | NULL       | NULL   | NULL          | NULL | NULL    | NULL | NULL | No tables used |
+----+--------------------+------------+--------+---------------+------+---------+------+------+----------------+
4 rows in set (0.00 sec)

 

Неактивен

 

Board footer

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