【问题标题】:MYSQL - Query many to many relation on multiple resultsMYSQL - 查询多个结果的多对多关系
【发布时间】:2018-10-11 08:56:15
【问题描述】:

我有两个具有多对多关系的表(玩家和组)和一个联结表(player_group):

表“玩家”


表“组”


和联结表:

表“玩家组”

一个玩家可以是多个组的一部分,一个组可以有多个玩家。用户也可以是组的管理员,由标志“flg_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|

GROUP B 的 flg_admin 设置为 1,但如上图所示,该玩家不是 GROUP B 的管理员。 我已经尝试了几个小时来解决这个问题,但我已经用尽了我的选择,我们将不胜感激任何有关此查询的帮助。

【问题讨论】:

    标签: mysql sql many-to-many


    【解决方案1】:

    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
    

    DEMO

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

    【讨论】:

    • 我认为这将是问题所在,但无法解决如何解决问题。我没有使用group 作为表名,因为我的列名不是英文的,为了方便起见,我只是翻译了所有内容。谢谢你的帮助:)
    【解决方案2】:

    类似:

    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';
    

    也许吧。

    【讨论】:

      【解决方案3】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多