编辑;我第一次误解了这个问题,所以我改变了我的答案。
SELECT l.id
FROM List_of_ids AS l
JOIN Groups AS g ON CONCAT('|', g.members, '|') LIKE CONCAT('%|', l.id, '|%')
GROUP BY l.id
HAVING COUNT(*) <= 3
这样做肯定会执行得很差,因为它强制对两个表进行表扫描。如果你有500个ID和500个组,它必须运行250000次比较。
你应该真的考虑是否存储符号分隔列表是正确的方法。见我的回答Is storing a delimited list in a database column really that bad?
正确的方式来设计这种关系是建立第三个表的ID映射到组:
CREATE TABLE GroupsIds (
memberid INT,
groupid INT,
PRIMARY KEY (memberid, groupid)
);
有了这张表,这将是使用索引更有效对于加盟:
SELECT l.id
FROM List_of_ids AS l
JOIN GroupsIds AS gi ON gi.memberid = l.id
GROUP BY l.id
HAVING COUNT(*) <= 3
优秀分贝设计。 – Mihai
@Mihai讽刺指出的是,你有一个基本的数据库设计问题。你真的需要规范化这些数据。您是否打开了关于更改数据库模式的建议,因为如果没有这些建议,我会建议您尝试使用您选择的编程语言来解决此问题。 –