2010-09-16 3 views
4

Я храню жесткий списокMySQL Переменные, GROUP_CONCAT, и используя его позже

SELECT @items := GROUP_CONCAT(ID) FROM table_1 ... etc 

@items теперь строка чисел: 55,77,99,2038,2844 и т.д.

Позже я пытаюсь использовать его в таком месте:

SELECT * FROM table_2 WHERE table_1.ID IN (@items) 

Это не работает. Похоже, должно. Я знаю, когда я вручную вытащить данные, поместить его в переменную, а затем вывести его он работает:

list($x) = SELECT @items := GROUP_CONCAT(ID) FROM table_1 ... etc 
$goodResults = SELECT * FROM table_2 WHERE table_1.ID IN ($x) 

Любые идеи? Благодарю.

ответ

10

Вы можете использовать FIND_IN_SET() функцию:

SELECT * FROM table_1 WHERE FIND_IN_SET(id, @items) > 0; 

Контрольный пример:

CREATE TABLE table_1 (id int, group_id int); 
INSERT INTO table_1 VALUES (1, 1); 
INSERT INTO table_1 VALUES (2, 1); 
INSERT INTO table_1 VALUES (3, 1); 
INSERT INTO table_1 VALUES (4, 1); 
INSERT INTO table_1 VALUES (5, 1); 

SELECT @items := GROUP_CONCAT(id) FROM table_1 GROUP BY group_id; 

SELECT * FROM table_1 WHERE FIND_IN_SET(id, @items) > 0; 
+------+----------+ 
| id | group_id | 
+------+----------+ 
| 1 |  1 | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  1 | 
| 5 |  1 | 
+------+----------+ 
5 rows in set (0.02 sec) 

SQL FIDDLE

+0

это работало большое спасибо: D – Tickthokk

+0

PERFECT вещь! (: – LLPrudente

0

С MySQL manual:

«Пользовательские переменные специфичный для подключения. То есть пользователь var iable, определенный одним клиентом, не может быть замечен или использован другими клиентами. Все переменные для данного клиентского соединения автоматически освобождается, когда клиентские выходы».

Поскольку вы отметили„потом“, возможно, что соединение создает переменную было разрушено, а переменный теряются.

могли бы вы ?..! временно удерживать значение переменной в таблице

+1

Да, это то же соединение. Хорошая мысль, хотя, я буду более конкретным в следующий раз :) – Tickthokk

Смежные вопросы