Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Передача значения в подзапрос


Автор: Plavozont 18.3.2013, 13:09
Здравствуйте, подскажите пожалуйста как сделать запрос, объясню поэтапно:

Этап 1 - работает
Код

SELECT table1.value1 FROM table1


Этап 2 - работает
Код

SELECT (SELECT table1.value1) as value1 FROM table1


Этап 3 - не работает
Код

SELECT (SELECT (SELECT table1.value1 as value1)) as value1 FROM table1


Пытался решить это с помощью переменной:

Этап 1 - работает
Код

SELECT @var1:=table1.value1, (SELECT @var1) as value1 FROM table1


Этап 2 - не работает
Код

SELECT @var1:=table1.value1, (SELECT (SELECT @var1 as value1)) as value1 FROM table1


Т.е. @var1 внутри двойного подзапроса куда-то пропадает, как передать из внешнего запроса во внутренний подзапрос значение если там двойное вложение...



Автор: Akina 18.3.2013, 13:55
Цитата(Plavozont @  18.3.2013,  14:09 Найти цитируемый пост)
Этап 3 - не работает

Код

mysql> create table table1(value1 int);
Query OK, 0 rows affected (0.13 sec)

mysql> insert into table1(value1) values (1),(3),(5);
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT table1.value1 FROM table1;
+--------+
| value1 |
+--------+
|      1 |
|      3 |
|      5 |
+--------+
3 rows in set (0.03 sec)

mysql> SELECT (SELECT table1.value1) as value1 FROM table1;
+--------+
| value1 |
+--------+
|      1 |
|      3 |
|      5 |
+--------+
3 rows in set (0.00 sec)

mysql>
mysql>
mysql>  SELECT (SELECT (SELECT table1.value1 as value1)) as value1 FROM table1;
+--------+
| value1 |
+--------+
|      1 |
|      3 |
|      5 |
+--------+
3 rows in set (0.00 sec)

mysql>

Держи руки прямее...

Автор: Plavozont 18.3.2013, 14:30
Выпрямляюсь:

Так работает
Код

SELECT 
 table1.value1
FROM
 (SELECT "1" as value1 UNION SELECT "3" UNION SELECT "5") as table1;


Так работает
Код

SELECT 
 (SELECT table1.value1)
FROM
 (SELECT "1" as value1 UNION SELECT "3" UNION SELECT "5") as table1;


А так не работает :(
Код

SELECT
 (SELECT * FROM (SELECT table1.value1 as value1) as table1)
FROM
 (SELECT "1" as value1 UNION SELECT "3" UNION SELECT "5") as table1;


Как передать туда table1.value1, если такой код работает:

Код

SELECT 
 @t1:=value1, (SELECT @t1) as t1
FROM
 (SELECT "1" as value1 UNION SELECT "3" UNION SELECT "5") as table1;


а такой уже нет :(

Код

SELECT
 @t1:=value1, (SELECT * FROM (SELECT @t1 as value1) as table1) as t1
FROM
 (SELECT "1" as value1 UNION SELECT "3" UNION SELECT "5") as table1;

Автор: Akina 18.3.2013, 15:46
http://segfault.kiev.ua/smart-questions-ru.html#goal

Автор: Plavozont 18.3.2013, 15:56
Это всё моё не здоровое стремление хранить сложные данные в текстовом формате вместо суперреляционного формата...

Я хотел создать текстовое поле содержащее мультиселект из справочника

В текстовое поле пишем 

Код

1|2|3


В справочнике пишем
Код

+--------+--------+
| code   | mame   |
+--------+--------+
|      1 | яблоки |
|      2 | груши  |
|      3 | сливы  |
|      4 | морковь|
+--------+--------+



на выходе хотим получить выбранные в мультиселекте пункты

Код

яблоки
груши
сливы


делается это так

Код

SELECT GROUP_CONCAT(plant_decode SEPARATOR "\n") FROM
(SELECT plants.code, IF(INSTR(CONCAT("|", "1|2|3", "|") , CONCAT("|", plants.code, "|"))>0,plants.name,"") as plant_decode FROM

(SELECT "1" as code, "яблоки" as name
UNION
SELECT "2" as code, "груши" as name
UNION
SELECT "3" as code, "сливы" as name
UNION
SELECT "4" as code, "морковь" as name) as plants

WHERE

IF(INSTR(CONCAT("|", "1|2|3", "|") , CONCAT("|", plants.code, "|"))>0,1,0)<>0) as groupc


но эта штука не втюхивается в запрос :(

весь цивилизованный мир наверное хранит сразу значения без кодов вот так

Код

яблоки|груши|сливы


и не надо ничё перекодировывать...

Автор: Akina 18.3.2013, 18:33
Вот оно тебе надо - такой геморрой? типичное много-ко-много, связующая таблица, всё ясно и понятно... 

Автор: Plavozont 18.3.2013, 19:09
Приходится, или систему в корне менять или выкрутиться одним выкрутасом и просто чиканить его везде потом... до очередной беды... эх...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)