MySql:返回变量中的ID列表,并在in子句中重用该变量

MySql:返回变量中的ID列表,并在in子句中重用该变量,mysql,Mysql,请参阅示例代码 -- 1st select, getting AssetID from asset table SELECT GROUP_CONCAT(AssetID) INTO @AssetIDs FROM asset; -- 2nd select, use @AssetIDs in an IN clause SELECT AssetID from asset where AssetID IN (@AssetIDs) 从第一次选择开始,它返回10个ID,这些ID存储在@AssetIDs

请参阅示例代码

-- 1st select, getting AssetID from asset table
SELECT GROUP_CONCAT(AssetID)
INTO @AssetIDs
FROM  asset;

-- 2nd select, use @AssetIDs in an IN clause 
SELECT AssetID
from asset
where AssetID IN (@AssetIDs)
从第一次选择开始,它返回10个ID,这些ID存储在@AssetIDs中 所以我会想象@AssetIDs='1,2,3,4,5,6,7,8,9,10'

但是,第二个select始终返回第一个ID 1


有人能帮我找到一种方法来选择在in子句中重用该变量的变量中的ID列表吗?

我改用了tmp表

DROP TEMPORARY TABLE IF EXISTS tmpassetlist; 
CREATE TEMPORARY TABLE tmpassetlist AS
(
    SELECT AssetID
    FROM asset
    WHERE (condition)
);
然后进行连接:

SELECT AssetID
from asset JOIN tmpassetlist
ON asset.AssetID = tmpassetlist.AssetID

我认为它的性能也更好,因为当列表变长时,IN子句可能会变得非常慢。

我使用了一个tmp表

DROP TEMPORARY TABLE IF EXISTS tmpassetlist; 
CREATE TEMPORARY TABLE tmpassetlist AS
(
    SELECT AssetID
    FROM asset
    WHERE (condition)
);
然后进行连接:

SELECT AssetID
from asset JOIN tmpassetlist
ON asset.AssetID = tmpassetlist.AssetID

我认为它的性能也更好,因为当列表变长时,IN子句可能会变得非常慢。

为什么要使用变量?只需从asset中选择AssetID-如果您真的必须这样做,请参阅@AlexK。然后从asset中选择AssetID作为最简单的查询,不需要IN@drewha yes good point为了评估AssetID在'1,2,3,4,5,6,7,8,9,10'中的位置,MySQL通过从左侧取所有数字(仅为'1',将字符串'1,2,3,4,5,6,7,8,9,10'隐式转换为int。因此,查询将查找ID为1的记录。我不太喜欢这种转换,我宁愿看到它导致错误,因为'1,2,3,4,5,6,7,8,9,10'显然不是整数。不过,MySQL的人就是这样决定的。@ThorstenKettner啊,我现在明白了。这就是为什么它总是返回第一个ID为什么要使用变量?只需从asset中选择AssetID-如果您真的必须这样做,请参阅@AlexK。然后从asset中选择AssetID作为最简单的查询,不需要IN@drewha yes good point为了评估AssetID在'1,2,3,4,5,6,7,8,9,10'中的位置,MySQL通过从左侧取所有数字(仅为'1',将字符串'1,2,3,4,5,6,7,8,9,10'隐式转换为int。因此,查询将查找ID为1的记录。我不太喜欢这种转换,我宁愿看到它导致错误,因为'1,2,3,4,5,6,7,8,9,10'显然不是整数。不过,MySQL的人就是这样决定的。@ThorstenKettner啊,我现在明白了。这就是为什么它总是返回第一个ID