MySQL变量,GROUP_CONCAT,以后再使用它

时间:2010-09-16 19:31:41

标签: php mysql

我正在存储

的硬件清单
SELECT @items := GROUP_CONCAT(ID) FROM table_1 ... etc

@items现在是一串数字:55,77,99,2038,2844等

稍后,我尝试在where子句中使用它:

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)

有什么想法吗?感谢。

3 个答案:

答案 0 :(得分:12)

您可能想要使用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

答案 1 :(得分:1)

“@ items现在是一串数字”。 IN子句需要一个集合。

http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in

答案 2 :(得分:0)

来自MySQL manual

“用户定义的变量是特定于连接的。也就是说,其他客户端无法看到或使用由一个客户端定义的用户变量。当客户端退出时,将自动释放给定客户端连接的所有变量。” p>

因为您之后注意到“创建变量的连接可能已被破坏且变量丢失。”

您可以暂时将变量值保存在表格中吗?