2

我在 MySQL 中有两个表

表 1:ID 列表

--只有一列ID的列表

表 2:组

--组标题

--成员**

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

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

在那里,他们可以在该字段中列出多达 500 多个。

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

我一直在努力解决它,但老实说,我完全迷路了。有任何想法吗?

4

2 回答 2

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 次比较。

您应该真正考虑存储以符号分隔的列表是否是正确的方法。请参阅我对在数据库列中存储分隔列表真的那么糟糕吗?

设计这种关系的正确方法是创建将 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 
于 2013-10-21T21:24:22.250 回答
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
于 2013-10-21T21:27:34.290 回答