MySQL SELECT * FROM表WHERE ID IN(子查询)

时间:2019-04-03 07:23:08

标签: mysql

我有一个包含像这样的字符串的字段:

["688024","688023","688025"]

每个值都与另一个表中的ID相关。我可以这样删除括号和引号:

SELECT REPLACE(REPLACE(REPLACE(myField,'"',""),'[',''),']','') FROM myTable WHERE myID = 123456

这给了我

688024,688023,688025

然后我想像这样在IN语句中使用它:

SELECT * FROM myOtherTable WHERE myOtherID IN (SELECT REPLACE(REPLACE(REPLACE(myField,'"',""),'[',''),']','') FROM myTable WHERE myID = 123456)

但是,它仅返回1个结果,即ID 688024(第一个)。如果执行以下操作,我会得到3个结果:

SELECT * FROM myOtherTable WHERE myOtherID IN (688024,688023,688025)

为什么子查询只会给我1个结果?谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用FIND_IN_SET

SELECT *
FROM myOtherTable t1
WHERE EXISTS (SELECT 1 FROM myTable t2
              WHERE myID = 123456 AND
              FIND_IN_SET(t1.myOtherID,
                  REPLACE(REPLACE(REPLACE(myField, '"', ""), '[', ''), ']', '')) > 0);

但是请注意,由于要存储CSV数据,因此您当前的表格设计欠佳。 myTable表的一种更好的方法是将每个myField值放在单独的行中,如下所示:

myID   | myField
123456 | 688024
123456 | 688023
123456 | 688025

然后,您只需要一个简单得多的查询:

SELECT *
FROM myOtherTable t1
WHERE EXISTS (SELECT 1 FROM myTable t2
              WHERE myID = 123456 AND t1.myOtherID = t2.myField);

答案 1 :(得分:0)

您确定WHERE myID = 123456与您要实现的目标没有冲突吗?在我看来,这是导致问题的原因,它仅返回具有此类ID的记录。