简单的Mysql表连接问题

时间:2009-02-18 21:30:12

标签: mysql join

我正在设计一个网站,教我自己如何在mysql中使用表连接,并且很早就被卡住了。 (这些数字是Wii好友代码,如果这有助于你理解这一点!)

我有3张桌子:

用户:

id, firstname, surname

游戏:

id, title

数:

number, users_id, game_id

该号码是属于用户并与游戏相关联的唯一代码。

我正在尝试列出特定游戏的数字列表以及他们所属的用户名。

我正在运行查询:

SELECT firstname, surname, number FROM games, users, numbers WHERE numbers.game_id = games.id AND games.title = 'foogame'
例如,拿出属于foogame的所有数字。但是,这会返回任何没有此游戏代码的用户使用来自其他用户的随机代码。如何使此查询仅返回实际拥有该游戏代码的用户?

6 个答案:

答案 0 :(得分:9)

如果您实际使用连接,我会发现它更容易,因为您不会像第一次那样错过连接条件。

SELECT firstname, surname, number 
FROM users u
INNER JOIN numbers n
  on n.users_id = u.id
INNER JOIN games g
  on n.game_id = g.id
WHERE g.title = 'foogame'

INNER JOIN相当于你所做的 - 它具体限制。

答案 1 :(得分:1)

SELECT firstname, surname, number
FROM games g, numbers n, users u
WHERE g.title = 'foogame'
  AND n.game_id = g.id
  AND u.id = n.users_id

要优化,请创建索引:

CREATE INDEX ix_game_title ON games (title)

CREATE INDEX ix_numbers_game ON numbers (game_id, users_id)

当然,还要制作games.idusers.id主键。

如果您希望在给定某个numbers的所有games中搜索user,您还需要:

CREATE INDEX ix_numbers_users ON numbers (users_id)

答案 2 :(得分:1)

我建议最初从一个更改开始。

甚至不要调用任何对象或属性'数字'。

在这种情况下,可以分别调用表格和“game_code”和“game_codes”列。

那么:

SELECT firstname, surname, number 
FROM games, users, numbers 
WHERE numbers.game_id = games.id AND games.title = 'foogame'

变为

SELECT firstname, surname, game_code
FROM games g, users u, game_codes gc
WHERE gc.game_id = g.id AND g.title = 'foogame'

当然其他人加入

AND gc.users_id = u.id

答案 3 :(得分:0)

啊 - 只是写这个问题帮助了我!

SELECT firstname, surname, number 
FROM   games, users, numbers 
WHERE  numbers.game_id = games.id AND 
       games.title = 'foogame' AND 
       games.user_id = users.id

简单!

有关优化此事的任何想法吗?

答案 4 :(得分:0)

您需要将numbers表格的users_idgame_id列与用户和游戏ID列相关联。 只需添加:

AND users_id = users.id
AND game_id = games.id

您也可以改用JOIN

答案 5 :(得分:0)

跟进汤姆的回答......如果你是MySQL的新手,我建议分步一步,明确从哪里抓到的东西。您可以将它视为两个表的连接,然后第三个进入啤酒节。您还可以使用括号,这样当您几个月后再回到它时会有一些分离。

SELECT firstname, surname, number 
    FROM 
    (
        (users u INNER JOIN numbers n ON(n.user_id = u.id) )
        INNER JOIN games g ON(n.game_id = g.id)
    )
    WHERE g.title = 'foogame'