2016-02-23 34 views
0

我的表的形式如下,其中包含組及其成員。MySQL:獲取用戶組及其所有成員

+---------+----+-------+ 
| group | p | state | 
+---------+----+-------+ 
| group a | p1 |  3 | 
| group a | p2 |  1 | 
| group a | p3 |  0 | 
| group a | p4 |  3 | 
| group b | p1 |  1 | 
| group b | p2 | NULL | 
| group b | p3 |  3 | 
| group c | p2 |  1 | 
| group c | p3 | NULL | 
| group c | p4 |  3 | 
+---------+----+-------+ 

我想獲取所有的團體,它的成員,其中p1是的一部分。

我想出了這個

select group, p from `groups` where group in (select DISTINCT group from `groups` where p = "p1") 

規模爲每組約10萬用戶,用戶可以任意數量的組的一部分。 有沒有更有效的方法呢?

+1

如果你珍惜你的理智,請勿將保留字用作表格/列標識符。 – Strawberry

+0

@Strawberry謝謝,但上表是我創建的虛擬表,僅僅是爲了在此提出這個問題。沒有注意到瘋狂。 –

回答

0

你可以嘗試自加入這樣的:

select t1.group,t1.p,t1.state 
from groups as t1 
inner join (
    select group 
    from groups 
    where p = 'p1' 
) as t2 on t1.group = t2.group 
+0

它是如何比我發佈的查詢(只包含子查詢)更好,還可以防止內部加入? 「內連接」比「內」更好? –

+1

INNER JOIN通常比在子查詢中使用IN要好很多。問題出現在INNER JOIN有多個匹配的時候(因爲這時你需要加入2行) – Kickstart

+0

'(select group ...)' - >'(select DISTINCT group ...)'解決「多個匹配」 。 –

0

如果「P1」只能出現每組一次,然後你可以做一個簡單的JOIN: -

SELECT a.`group`, a.p 
FROM `groups` a 
INNER JOIN `groups` b 
ON a.`group` = b.`group` 
WHERE b.p = 'p1' 
相關問題