我正试图使用in查询中的子查询的结果来根据第二个表中的某些id返回表中的某些结果。表1的结构并不重要,但表2存储如下信息:

other_ID  | members
1         | .10.,.16.,.86.
2         | .32.,.34.

other_ID存储为INT,而members存储为TEXT。我没有创建表结构,但我的理解是,成员是以这种格式存储的,因为在数据库的列中存储可变长度的csv会变得很困难。不管怎样,我都无法更改表结构。
我有以下疑问:
SELECT * FROM Table1 WHERE
Table1.ID IN (REPLACE((SELECT members FROM Table2 WHERE other_ID = 2), ".", ""));

尽我所能,查询只返回members列(即32)中第一个值的值。如果我尝试以下查询:
SELECT * FROM Table1 WHERE Table1.ID IN (32,34);

结果返回成功。
你知道我做错了什么吗?

最佳答案

您可以尝试在这里使用REGEXP和一个连接:

SELECT t1.*
FROM Table1 t1
INNER JOIN Table2 t2
    ON t2.members REGEXP CONCAT('[[:<:]]', t1.ID, '[[:>:]]')
WHERE
    t2.other_ID = 2;

上面使用的regex逻辑将比较此成员字符串:
.32.,.34.

针对这样的正则表达式:
\b34\b

这应该有效,因为members中每个数字周围的逗号/圆点形成一个单词边界。
请注意,这里最好的长期解决方案是不要以非标准化csv格式存储数据。

关于mysql - SELECT IN查询使用返回值作为CSV,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56520845/

10-11 01:57