mysql-查询多个结果的多对多关系

piv4azn7  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(420)

我有两个具有多对多关系的表(player和group)和一个连接表(player\u group):
表“播放器”

表“组”

以及连接表:
表“玩家组”

一个玩家可以是许多组的一部分,一个组可以有许多玩家。用户也可以是组的管理员,由标志“flg\u admin”表示。
我想构建一个查询来告诉我,对于一个特定的玩家(假设player1的id=27):
玩家所属组的名称;
玩家所属的每个组中的玩家数量;
如果玩家是每组的管理员。
因此对于player1(id=27),结果是:

|group_name|no. members|flg_admin|
----------------------------------
|GROUP A   |         2 |        1|
|GROUP B   |         3 |        0|

我尝试了以下方法:

SELECT g.name, COUNT(x.id_player) as num_players, x.flg_admin 
FROM player_group x 
JOIN group g ON x.id_group=g.id 
WHERE id_group IN ( 
    SELECT
    id_group 
    FROM player_group 
    WHERE id_player=27) 
GROUP BY id_group;

但是,通过此查询,我得到以下结果:

|group_name|no. members|flg_admin|
----------------------------------
|GROUP A   |         2 |        1|
|GROUP B   |         3 |        1|

flgèu admin对于b组被设置为1,但是正如你在上面的图片中看到的,这个播放器不是b组的管理员。我一直试图得到这个权利几个小时没有用,我已经用尽了我的选择,任何帮助与此查询将不胜感激。

toe95027

toe950271#

x.flg_admin 不是从所选玩家的表行中获取,而是来自组中的任意行。
你需要加入 player_group 表两次,以便可以从正确的行中获取此列。

SELECT g.name, COUNT(*) as num_players, y.flg_admin 
FROM player_group x 
JOIN `group` g ON x.id_group=g.id 
JOIN player_group y ON y.id_group = x.id_group
WHERE y.id_player = 27
GROUP BY x.id_group

演示
顺便说一句,你不应该使用 group 作为表名或列名,因为它是保留关键字。

o75abkj4

o75abkj42#

我使用子查询的替代解决方案:

select tgrp.name, mgrp.members, pgrp.flg_admin
from player_group pgrp
  join `group` tgrp on pgrp.id_group=tgrp.id
  join (
    select id_group, count(*) members
    from player_group
    group by id_group
  ) mgrp on tgrp.id=mgrp.id_group
where pgrp.id_player=27;
x9ybnkn6

x9ybnkn63#

比如:

SELECT g.name AS group_name
    , (SELECT count(*) FROM player_group AS px WHERE px.id_group = pg.id_group) AS "no. members"
    , flg_admin
FROM players AS p
JOIN player_group AS pg on p.id = pg.id_player
JOIN "group" AS g on pg.id_group = g.id
WHERE p.username = 'player1';

也许 吧。

相关问题