我在 MySQL 中有两个表
表 1:ID 列表
--只有一列ID的列表
表 2:组
--组标题
--成员**
现在,成员字段基本上是一个注释字段,其中列出了属于该组的所有 ID。例如,整个成员字段如下所示:
"ID003|ID004|ID005|ID006|ID007|ID008|... Etc."
在那里,他们可以在该字段中列出多达 500 多个。
我想做的是运行一个查询并找出哪些 ID 只出现在三个或更少的组中。
我一直在努力解决它,但老实说,我完全迷路了。有任何想法吗?
编辑; 我第一次误解了这个问题,所以我正在改变我的答案。
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
select * from
(
select ID,
(
select count(*)
From Groups
where LOCATE(concat('ID', a.id, '|'), concat(Members, '|'))>0
) as groupcount
from ListIDTable as a
) as q
where groupcount <= 3