2011-07-22 54 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