【问题标题】:MySQL: fetch users groups and all it's membersMySQL:获取用户组及其所有成员
【发布时间】:2016-06-05 05:35:10
【问题描述】:

我的表格具有以下形式,其中包含组及其成员。

+---------+----+-------+
| 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")

每个组的规模约为 100,000 名用户,一个用户可以是任意数量的组的一部分。 有没有更有效的方法?

【问题讨论】:

  • 如果您重视自己的理智,请不要使用保留字作为表/列标识符。
  • @Strawberry 谢谢,但上表是我创建的一个虚拟表,只是为了在这里提出这个问题。没有注意到精神错乱。

标签: mysql performance select


【解决方案1】:

你可以像这样尝试自我加入:

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

【讨论】:

  • 它比我发布的查询(仅包含一个子查询)更好并且还可以防止内部联接? Inner joinin 好吗?
  • INNER JOIN 通常比在子查询中使用 IN 好很多。当 INNER JOIN 有多个匹配项时问题就来了(然后你登陆了 2 行加入)
  • ( select group... ) --> ( select DISTINCT group ... ) 解决“多重匹配”问题。
【解决方案2】:

如果 'p1' 只能在每个组中出现一次,那么您可以进行简单的 JOIN:-

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多