可以在连接条件中使用 MySQL 的FIND_IN_SET()
功能:
table_a JOIN table_b ON FIND_IN_SET(table_a.id_a, table_b.csv_a)
但是(根据我上面评论中的警告)这个操作将非常低效,因为 MySQL 必须完全扫描两个表。
一个更好的解决方案是创建一个关系表:
CREATE TABLE relations (
FOREIGN KEY (id_a) REFERENCES table_a (id_a),
FOREIGN KEY (id_b) REFERENCES table_b (id_b)
) SELECT table_a.id_a, table_b.id_b
FROM table_a JOIN table_b
ON FIND_IN_SET(table_a.id_a, table_b.csv_a);
ALTER TABLE table_b DROP csv_a;
然后可以根据需要通过连接表来查询所需的数据:
SELECT table_a.*
FROM table_a JOIN relations USING (id_a)
WHERE relations.id_b = ?
如果需要,甚至可以使用 MySQL 的GROUP_CONCAT()
函数来获取原始 CSV:
SELECT table_b.id_b, GROUP_CONCAT(relations.id_a) AS csv_a
FROM table_b JOIN relations USING (id_b)
WHERE ...
GROUP BY table_b.id_b