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