SQL: SELECT MAX (Date), включающий пару таблиц - PullRequest
1 голос
/ 23 февраля 2012

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

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

TABLE          COLUMNS

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

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

SELECT DISTINCT Games.Name,
(SELECT MAX(Date) FROM Played_Games WHERE Played_Games.Game_ID = Games.Game_ID) AS Date_Last_Played
FROM Games
ORDER BY Games.Name

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

Я задал несколько похожий вопрос несколько дней назад, но тогда моя цель состояла в том, чтобы перечислить все игры, сколько раз каждая игра была сыграна в общей сложности и сколько раз в каждую игру играли участники определенная группа людей (люди 1 и 2 - только пример). GarethD помог мне с этим, просто совершенным по приведенному ниже коду. Я пытался изменить этот код, чтобы решить мою новую задачу, потому что я думаю, что большая часть этой логики / структуры может быть повторно использована, но до сих пор я не добился успеха самостоятельно: - (

SELECT  Games.Name,
        IIF(ISNULL(TimesPlayed),0,TimesPlayed) AS Times_Played,
        IIF(ISNULL(TimesPlayedByGroupMembers),0,TimesPlayedByGroupMembers) AS Times_Played_By_Group_Members
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 Ответ

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

Я только что добавил пару строк к последнему ответу, который я опубликовал, чтобы показать дату последнего сыгранного и последнюю сыгранную участниками группы, рядом с количеством сыгранных раз. Надеюсь, это то, что вы после.

SELECT  Games.Name,
        IIF(ISNULL(TimesPlayed),0,TimesPlayed) AS Times_Played,
        IIF(ISNULL(TimesPlayedByGroupMembers),0,TimesPlayedByGroupMembers) AS Times_Played_By_Group_Members,
        LastPlayed,
        LastPlayedByGroupMembers
FROM    Games
        LEFT JOIN
        (   SELECT  Game_ID,
                    COUNT(*) AS TimesPlayed,
                    SUM(IIF(ISNULL(Participation.Played_Games_ID),0,1)) AS TimesPlayedByGroupMembers,
                    MAX(Played_Games.[Date]) AS LastPlayed,
                    MAX(IIF(ISNULL(Participation.Played_Games_ID),NULL,Played_Games.[Date])) AS LastPlayedByGroupMembers
            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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...