SQL注释分组

时间:2013-10-21 21:18:50

标签: mysql sql

我在MySQL中有两个表

表1:ID列表

- 只需一个ID

的列列表

表2:组

- 小组名称

- 成员**

现在,成员字段基本上是一个注释字段,其中列出了属于该组的所有ID。因此,例如,整个成员领域如下所示:

"ID003|ID004|ID005|ID006|ID007|ID008|... Etc."

他们可以在该领域列出多达500多名。

我想要做的是运行一个查询,找出哪个ID只出现在三个或更少的组中。

我一直在抨击它,但说实话,我完全迷失了。有什么想法吗?

2 个答案:

答案 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