MYSQL - запрашивает отношение многие ко многим по нескольким результатам - PullRequest
0 голосов
/ 11 октября 2018

У меня есть два стола (игрок и группа) с отношением многие ко многим и соединительная таблица (player_group):

Стол «игрок»

Table
Таблица "группа"

Table
и соединительная таблица:

Таблица "player_group"

Table

Игрок может быть частью многих групп, и в группе может быть много игроков.Пользователь также может быть администратором группы, представленным флагом "flg_admin".

Я хочу создать запрос, который говорит мне, для конкретного игрока (скажем, player1 с id = 27):

  • Название групп, к которым принадлежит игрок;
  • Количество игроков в каждой из групп, к которым принадлежит игрок;
  • Если игрок является администраторомкаждая группа.

Таким образом, для игрока1 (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_admin установлен как 1 для ГРУППЫ B, но, как вы можете видеть на изображениях выше, этот игрок не является администратором ГРУППЫ B. Я былпытаясь получить это право часами, но безрезультатно, и я исчерпал свои возможности, любая помощь по этому вопросу будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

Что-то вроде:

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

возможно.

0 голосов
/ 11 октября 2018

Мое альтернативное решение с использованием подзапроса:

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;
0 голосов
/ 11 октября 2018

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 в качестве имени таблицы или столбца, потому что этозарезервированное ключевое слово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...