2013-10-21 26 views
2

我有两个表中的MySQLSQL注释分组

表1:ID的

名单--just ID的

表2中的一列名单:组

--group标题

- 会员**

现在成员字段基本上是注释字段,其中列出了该组的所有ID。因此,例如成员之一,整场看起来是这样的:

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

在那里,他们最多可以在现场500+上市。

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

我一直在采取裂缝,但老实说我完全失去了。有任何想法吗?

+1

优秀分贝设计。 – Mihai

+0

@Mihai讽刺指出的是,你有一个基本的数据库设计问题。你真的需要规范化这些数据。您是否打开了关于更改数据库模式的建议,因为如果没有这些建议,我会建议您尝试使用您选择的编程语言来解决此问题。 –

回答

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 
+0

表名+1。 – Kermit

+0

您能否详细说明如何帮助获取哪些ID仅出现在三个或更少的组中? –

+0

@FilipeSilva字符串与分隔符之间的长度差异以及不带字符串的字符串显示ids.Separators数量=组数,分隔符为1个字符。 – Mihai

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