2011-07-22 55 views
0
SELECT `groups`.`name`, `groups`.`id` 
FROM `groups` 
JOIN `group_members` 
    ON (`group_members`.`user_id` = `groups`.`user_id`) 
WHERE `groups`.`user_id` = '33' 
ORDER BY `groups`.`id` 

我需要为他所属的每个组获取组的ID和组名。但结果不能重复!SQL连接的重复结果

我的查询返回了很多重复的条目。

groups存储所有存在的组(name,description等)。在group_members中存储了属于某个组的所有用户(user_id,group_id等)。

如何修改此查询以获得不重复但正确的结果?感谢您的建议!

编辑:

groups没有user_id。该组的所有成员都存储在group_members表中。我需要获得用户所在的所有组(组的ID和名称)。

+0

为什么组有一个user_id?它是主人吗? – Jacob

+0

@cularis:它不是代表组的GROUP表,它是GROUP_MEMBERS表,代表了mamber和group之间的连接... –

+0

@Daniel这就是为什么它不合逻辑地加入groups.user_id? – Jacob

回答

5

如果你想知道一个用户的所有群体,你必须加入对group_members.group_id和编辑WHERE条款。

SELECT `groups`.`name`, `groups`.`id` 
FROM `groups` 
JOIN `group_members` 
    ON (`group_members`.`group_id` = `groups`.`id`) 
WHERE `group_members`.`user_id` = '33' 
ORDER BY `groups`.`id` 
+0

我认为这是解决方案。 OP已经加入了错误的领域。 –

+0

+1做得好,搞清楚一个定义不清的问题。 –

+0

这可以工作,但使用EXISTS来优化:http:// stackoverflow。com/questions/6787927/duplicate-results-with-sql-join/6788056#6788056 – davorp

0

你混淆了一些领域我想,在这里你去:

SELECT `groups`.`name`, `groups`.`id` 
FROM `groups` 
JOIN `group_members`  
ON `group_members`.`group_id` = `groups`.`id` 
WHERE `groups_members`.`user_id` = '33' 
ORDER BY `groups`.`id 
+0

我实际上犯了一些错误,因为错误的假设,他需要从群组加入groups_members ... –

1

首先,您的查询状态:

`groups`.`user_id` = '33' 

这似乎不正确,因为为什么会有在组表中的用户?

关于这个问题。您可能正在重复,因为用户可以存在于多个组中。换句话说,如果您只需要每个用户一个组,那么这取决于您希望看到哪个组。它可以是最小的组ID,最大或几乎任何你想要的。

0
SELECT g.name, g.id 
FROM groups g 
where EXISTS (
    select 'x' 
    from group_members gm 
    where g.id = gm.group_id 
    and gm.user_id = '33' 
) 
ORDER BY g.id 
+0

最好的方法是使用EXISTS,现在我将重新查询查询... – davorp