0

我想知道会话变量如何IN使用 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);

查询输出(不准确

player_id 
88

需要结果

player_id 
88 
89   
4

3 回答 3

2

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);
于 2012-06-11T17:43:17.880 回答
0

据我所知,这是不可能的(编辑:事实证明@QueryMaster 能够证明它实际上是可能的,尽管使用 MySQL 专有扩展)按照您尝试的方式进行操作,因为@concat_var实际上的值是单个字符串,因此您的最后一个查询实际上等效于SELECT player_id FROM tableA WHERE player_id IN ('88,89')(MySQL 将'88,89'通过解析字符串的整数前缀来强制转换为数字上下文,因此88)。

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

SELECT player_id
FROM tableA
WHERE player_id IN (
    SELECT player_id
    FROM tableB
    WHERE id = 1
)

或几乎等效的(可能表现更好,因为它不涉及子查询):

SELECT player_id
FROM tableA
JOIN tableB USING (player_id)
WHERE tableB.id = 1
于 2012-06-11T10:27:11.370 回答
0

@concat_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_id是整数类型,MySQL 通过将字符串与浮点数进行比较来执行查询: player_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;
于 2012-06-11T10:29:15.177 回答