Самый эффективный способ запроса связи между таблицами один ко многим - PullRequest
0 голосов
/ 05 ноября 2011

У меня есть 3 таблицы MySQL, описывающие игру:

  1. gamelist {gameId, ... with Primary (gameId)} = Хранит информацию о каждом сеансе игры.
  2. userlist {userId, ... with Primary (userId)} = Хранит информацию о каждом пользователе.
  3. game2user {gameId, userId ... with Primary (gameId, userId)} = Хранит, какие пользователи участвуют в каждом игровом сеансе (один игровой сеанс двум или более пользователям).

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

Лучшее, что я когда-либо делал, это:

SELECT gl.gameid, gl.type, [...], ul.userid, ul.username
FROM userlist as ul, gamelist as gl, game2users as g2u
WHERE g2u.userid = a_certain_numeric_id AND
      ul.userid = g2u.userid AND
      gl.gameid = g2u.gameid`

При этом извлекаются уникальные строки из списка игр, но при этом выбираются только имя пользователя данного пользователя, а не его товарищи.

Вопрос в том, как я могу сделать это эффективно с точки зрения производительности (времени) и предпочтительно без выполнения отдельных запросов? Благодаря.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011
SELECT gl.gameid, gl.type, [...], ul.userid, ul.username
FROM userlist as ul, gamelist as gl, game2users as g2u
WHERE ul.userid = g2u.userid AND
      g2u.gameid IN (SELECT gameid
                     FROM game2users
                     WHERE userid = a_certain_numeric_id);

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

1 голос
/ 05 ноября 2011

Попробуйте это:

SELECT gl.gameid, gl.type, ..., ul.userid, ul.username
FROM
    (
        SELECT gameid
        FROM game2users
        WHERE userid = a_certain_numeric_id
    ) AS ug
    INNER JOIN gamelist AS gl
        ON ug.gameid = gl.gameid
    INNER JOIN game2users AS g2u
        ON ug.gameid = g2u.gameid
    INNER JOIN userlist AS ul
        ON g2u.userid = ul.userid
0 голосов
/ 05 ноября 2011

Полная схема для таблиц и связей поможет нам помочь вам.

Я не эксперт по MySQL, но, похоже, вам лучше использовать другую реализацию базы данных (если вы можете это изменить). Прямо сейчас у вас есть лишние записи в таблице games2user. Я думаю, что проще всего было бы дать пользовательской таблице атрибут, содержащий игру, в которую они вовлечены. Затем, когда вы делаете запрос по этой проблеме, вы можете просто запросить gamesTable для конкретной игры, в которой участвует пользователь, и получить ее. все идентификаторы пользователей, участвующих в этой игре.

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