我在MySQL中有两个表
表1:ID列表
- 只需一个ID
的列列表表2:组
- 小组名称
- 成员**
现在,成员字段基本上是一个注释字段,其中列出了属于该组的所有ID。因此,例如,整个成员领域如下所示:
"ID003|ID004|ID005|ID006|ID007|ID008|... Etc."
他们可以在该领域列出多达500多名。
我想要做的是运行一个查询,找出哪个ID只出现在三个或更少的组中。
我一直在抨击它,但说实话,我完全迷失了。有什么想法吗?
答案 0 :(得分:4)
编辑;我第一次误解了这个问题,所以我改变了我的答案。
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
答案 1 :(得分:2)
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