我正试图使用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/