编辑; 我第一次误解了这个问题,所以我正在改变我的答案。
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 次比较。
您应该真正考虑存储以符号分隔的列表是否是正确的方法。请参阅我对在数据库列中存储分隔列表真的那么糟糕吗?
设计这种关系的正确方法是创建将 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