我正在存储
的硬件清单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)
有什么想法吗?感谢。
答案 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)
答案 1 :(得分:1)
“@ items现在是一串数字”。 IN子句需要一个集合。
http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_in
答案 2 :(得分:0)
来自MySQL manual:
“用户定义的变量是特定于连接的。也就是说,其他客户端无法看到或使用由一个客户端定义的用户变量。当客户端退出时,将自动释放给定客户端连接的所有变量。” p>
因为您之后注意到“创建变量的连接可能已被破坏且变量丢失。”
您可以暂时将变量值保存在表格中吗?