如何使用MySQL处理IN子句中的会话变量?

如何使用MySQL处理IN子句中的会话变量?,mysql,variables,session-variables,Mysql,Variables,Session Variables,我想知道会话变量如何使用MySQL处理子句中的 我自己也试过,但没有成功 使用会话变量的查询 SET @concat_var := (SELECT GROUP_CONCAT(player_id) FROM tableB where id = 1); // result 88,89 SELECT @concat_var; SELECT player_id FROM tableA WHERE player_id IN (@concat_var); 查询输出(不准确) (需要结果) 据我所知,不可能

我想知道会话变量如何使用MySQL处理子句中的

我自己也试过,但没有成功

使用会话变量的查询

SET @concat_var := (SELECT GROUP_CONCAT(player_id) FROM tableB where id = 1);
// result 88,89
SELECT @concat_var;
SELECT player_id FROM tableA WHERE player_id IN (@concat_var);
查询输出(不准确)

(需要结果)


据我所知,不可能(edit:事实证明@QueryMaster能够证明它实际上是可能的,尽管使用了MySQL专有扩展)以您尝试的方式执行,因为
@concat\u var
的值实际上是一个字符串,因此,您的上一个查询实际上相当于
从tableA中选择player\u id,其中player\u id位于('88,89')
(MySQL将通过解析字符串的整数前缀将
'88,89'
强制转换为数字上下文,因此
88

但是,应可以执行以下操作:

SELECT player_id
FROM tableA
WHERE player_id IN (
    SELECT player_id
    FROM tableB
    WHERE id = 1
)
或几乎相同的(性能可能更好,因为它不涉及子查询):


@concat\u var
包含字符串
'88,89'
。因此:

SELECT player_id FROM tableA WHERE player_id IN (@concat_var);
正在执行:

SELECT player_id FROM tableA WHERE player_id IN ('88,89');
由于
player\u id
是一个整数类型,MySQL通过
player\u id
和作为浮点数的字符串执行查询:

SELECT player_id FROM tableA WHERE player_id IN (88.0);
因此,这就是为什么您看到报告的结果不正确

您应该改为使用联接:

SELECT player_id FROM tableA JOIN tableB USING (player_id) WHERE tableB.id = 1;
FIND_IN_SET()
是这个问题的答案

SET @concat_var := (SELECT GROUP_CONCAT(player_id) FROM tableB where id = 1);
SELECT @concat_var;
SELECT player_id FROM tableA WHERE FIND_IN_SET(player_id,@concat_var);

关于在_集中查找_()@QueryMaster:您可以在这里使用,但是连接更合适。@QueryMaster的观点很好。我不知道这件事。虽然它不是标准的SQL(我的解决方案是),而且恰好是OP要求的,但它可以工作。
SELECT player_id FROM tableA WHERE player_id IN (88.0);
SELECT player_id FROM tableA JOIN tableB USING (player_id) WHERE tableB.id = 1;
SET @concat_var := (SELECT GROUP_CONCAT(player_id) FROM tableB where id = 1);
SELECT @concat_var;
SELECT player_id FROM tableA WHERE FIND_IN_SET(player_id,@concat_var);