SQL: SELECT COUNT, включающий пару таблиц - PullRequest
2 голосов
/ 15 февраля 2012

У меня есть небольшая база данных MS Access, содержащая четыре таблицы, и я борюсь с запросом SELECT COUNT, который включает все таблицы. Любая помощь будет принята с благодарностью.

Обзор базы данных:

TABLE       COLUMNS

Person         Person_ID |....
Games          Game_ID | Name |....
Played_Games   Played_Games_ID | Game_ID |....
Participation  Played_Games_ID | Person_ID |...

Чтобы перечислить все игры и сколько раз каждая игра была сыграна, я использую:

SELECT DISTINCT
Games.Name,
(SELECT COUNT(*) FROM Played_Games WHERE Played_Games.Game_ID = Games.Game_ID) AS TimesPlayed
FROM Games
ORDER BY Games.Name

Это прекрасно работает, но я также хотел бы перечислить, сколько раз в каждую игру играют члены определенной группы людей

Я добился некоторого прогресса с кодом ниже (строка 4), но я все еще застрял с одной маленькой проблемой:

Ссылка на Games.Game_ID в конце самых внутренних скобок больше не связана с текущим Game_ID, как в коде выше. Теперь это кажется неопределенным. Когда я запускаю это в MS Access Query Designer для тестирования, он просит меня ввести значение для Games.Game_ID. Если я затем наберу какой-нибудь случайный Game_ID, код будет работать «отлично», но, как вы, вероятно, уже поняли, значение TimesPlayedByGroupMembers будет одинаковым для каждой строки в наборе записей и будет истинным только для этого конкретного Game_ID, который я набрал

SELECT DISTINCT
Games.Name,
(SELECT COUNT(*) FROM Played_Games WHERE Played_Games.Game_ID = Games.Game_ID) AS TimesPlayed,
(SELECT COUNT(*) FROM (SELECT DISTINCT Played_Games_ID FROM Participation WHERE Played_Games_ID IN (SELECT Played_Games_ID FROM Played_Games WHERE Game_ID = Games.Game_ID) AND Person_ID IN (26, 27, 28))) AS TimesPlayedByGroupMembers
FROM Games
ORDER BY Games.Name

Я попытаюсь объяснить, что мой код делает и / или должен делать изнутри

В самых внутренних скобках перечислены Played_Games_ID, относящиеся к текущей игре, но это не работает, поскольку Games.Game_ID не связан с текущим Game_ID

В средних скобках (включая приведенную выше) перечислены Played_Games_ID's, в которых участвует текущая игра и один или несколько выбранных персонажей. Перечисленные здесь Person_ID являются лишь примером, и эта часть кода работает

Крайние скобки (включая все вышеперечисленные) подсчитывают, сколько раз в каждую игру играет один или несколько выбранных лиц

Я действительно застрял с этим, поэтому любая помощь будет принята с благодарностью

Спасибо за ваше время

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Мой синтаксис Access несколько ржавый, и я не на 100% уверен в структуре вашей таблицы, но думаю, что ниже будет работать.

SELECT  Games.Name, 
        TimesPlayed,
        TimesPlayedByGroupMembers
FROM    Games
        INNER JOIN 
        (   SELECT  Game_ID, 
                    COUNT(*) AS TimesPlayed,
                    SUM(IIF(ISNULL(Participation.Played_Games_ID),0,1)) AS TimesPlayedByGroupMembers
            FROM    Played_Games 
                    LEFT JOIN 
                    (   SELECT  Played_games_ID 
                        FROM    Participation 
                        WHERE   Person_ID IN (1, 2) 
                        GROUP BY Played_games_ID 
                    ) AS Participation 
                        ON Participation.Played_Games_ID = Played_Games.Played_Games_ID
            GROUP BY Game_ID
        ) AS Played_Games
            ON Played_Games.Game_ID = Games.Game_ID
ORDER BY Games.Name

ДОПОЛНЕНИЕ:

Чтобы игры, в которые еще не играли, отображались как 0, используйте следующее:

SELECT  Games.Name, 
        IIF(ISNULL(TimesPlayed),0,TimesPlayed) AS TimesPlayed,
        IIF(ISNULL(TimesPlayedByGroupMembers),0,TimesPlayedByGroupMembers) AS TimesPlayedByGroupMembers
FROM    Games
        LEFT JOIN 
        (   SELECT  Game_ID, 
                    COUNT(*) AS TimesPlayed,
                    SUM(IIF(ISNULL(Participation.Played_Games_ID),0,1)) AS TimesPlayedByGroupMembers
            FROM    Played_Games 
                    LEFT JOIN 
                    (   SELECT  Played_games_ID 
                        FROM    Participation 
                        WHERE   Person_ID IN (1, 2) 
                        GROUP BY Played_games_ID 
                    ) AS Participation 
                        ON Participation.Played_Games_ID = Played_Games.Played_Games_ID
            GROUP BY Game_ID
        ) AS Played_Games
            ON Played_Games.Game_ID = Games.Game_ID
ORDER BY Games.Name
1 голос
/ 15 февраля 2012

Ваш первый запрос обычно выполняется следующим образом:

SELECT
Games.Name, COUNT(Played_Games.Game_ID) AS TimesPlayed
FROM Games
INNER JOIN Played_Games ON Played_Games.Game_ID = Games.Game_ID
GROUP BY Games.Name
ORDER BY Games.Name

Это может быть близко к тому, что вы ищете со вторым запросом:

SELECT
Games.Name, COUNT(Participation.Played_Games_ID) AS TimesPlayedByGroupMembers
FROM Games
INNER JOIN Played_Games ON Played_Games.Game_ID = Games.Game_ID
INNER JOIN Participation ON Participation.Played_Games_ID = Played_Games.Played_Games_ID
WHERE Participation.Person_ID IN (26, 27, 28)
GROUP BY Games.Name
ORDER BY Games.Name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...