MySQL从id所在的表中选择*(子查询)

MySQL从id所在的表中选择*(子查询),mysql,Mysql,我有一个包含如下字符串的字段: ["688024","688023","688025"] 这些值中的每一个都与另一个表中的ID相关。我可以这样去掉括号和引号: SELECT REPLACE(REPLACE(REPLACE(myField,'"',""),'[',''),']','') FROM myTable WHERE myID = 123456 这给了我: 688024,688023,688025 然后我想在中的语句中使用它,如下所示: SELECT * FROM myOtherTab

我有一个包含如下字符串的字段:

["688024","688023","688025"]
这些值中的每一个都与另一个表中的ID相关。我可以这样去掉括号和引号:

SELECT REPLACE(REPLACE(REPLACE(myField,'"',""),'[',''),']','') FROM myTable WHERE myID = 123456
这给了我:

688024,688023,688025
然后我想在中的
语句中使用它,如下所示:

SELECT * FROM myOtherTable WHERE myOtherID IN (SELECT REPLACE(REPLACE(REPLACE(myField,'"',""),'[',''),']','') FROM myTable WHERE myID = 123456)
但是,它只返回1个结果,即ID688024(第一个)。如果我执行以下操作,我会得到3个结果:

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

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

您确定myID=123456的
与您想要实现的目标没有冲突吗?在我看来,这是造成问题的原因,它只返回具有此类id的记录。

您确定
其中myID=123456
与您想要实现的目标没有冲突吗?在我看来,这是造成问题的原因,它只返回具有此类id的记录。

您可以使用
在集合中查找:

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);

您可以使用
在集合中查找

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);

字符串与MySQL中的数字不同。所以MySQL将“688024688023688025”转换为一个数字,即688024。真正的解决方案是规范化数据库。这很有意义!那么有没有办法将“688024688023688025”转换成3个逗号分隔的数字呢?在MySQL中,字符串与数字是不同的。所以MySQL将“688024688023688025”转换为一个数字,即688024。真正的解决方案是规范化数据库。这很有意义!那么有没有办法将“688024688023688025”转换成3个逗号分隔的数字呢?这看起来更像是一个注释而不是答案,不是吗?是的,
FIND_IN_SET
可以完成这项工作,但更好的解决方案是规范化数据。这非常有效!谢谢我同意数据重组——事实上,这正是我正在做的。这是使两个系统同步的临时修复程序。是的,
FIND_IN_SET
可以完成这项工作,但更好的解决方案是规范化数据。这非常有效!谢谢我同意数据重组——事实上,这正是我正在做的。这是使两个系统同步的临时修复程序。