2011-11-05 74 views
0

我描述一个游戏3个MySQL表:最有效的方法来查询一个多对多的关系表

  1. 游戏列表{游戏ID,...原发性(游戏ID)} =存储关于每场比赛会话。
  2. userlist {userId,... with Primary(userId)} =存储每个用户的信息。
  3. game2user {gameId,userId ... with Primary(gameId,userId)} =存储哪个用户参与每个游戏会话(一个游戏会话给两个或更多用户)。

现在,对于某个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` 

这将会从游戏排行榜中的唯一行,但只获取给定用户的用户名,而不是他的同球员。

问题是如何在性能(时间)方面有效地执行此操作,并且最好不进行单独的查询?谢谢。

+0

你有表结构? –

回答

1

试试这个:

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

这是最接近我想要的。我得到了每个游戏组合的行数,这几乎是我所需要的。有没有办法让每个游戏会话中的所有用户名减去当前的一行? – TudorT

+0

,我已经有解决的代码是这样的:'选择 G *,u.username FROM 游戏列表摹 内对gu.gameid = g.gameid加入game2users区 内部联接game2users GU2上 gu2.gameid = gu.gameid and gu2.userid = the_constant u.userid = gu.userid内的加入用户列表u 按g.gameid,u.userid'排序 – TudorT

-1

表格和关系的完整模式将帮助我们帮助您。

我不是MySQL的专家,但看起来你可能会更好地使用不同的数据库实现(如果可以更改的话)。现在你在games2user表中有多余的记录。我认为最简单的事情是给用户表格一个包含他们参与的游戏的属性。然后,当你对这个问题进行查询时,你可以查询用户参与和检索的特定游戏的游戏表格所有参与该游戏的用户ID。

+0

模式是正确的,也是处理关系数据库中多对多关系的标准方法。 (即游戏可以有许多参与者/用户,并且用户可以是许多游戏中的参与者)。遵循你的建议,你一次只限制一个游戏参与,这在这种情况下是不希望的。 -1。 – PatrikAkerstrand

2
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); 

这实质上是查找给定用户参与的所有游戏(在子查询中),然后选择所有也参与该游戏的用户。