简单的Mysql表连接问题

简单的Mysql表连接问题,mysql,join,Mysql,Join,我正在设计一个网站来教自己如何在mysql中使用表连接,我很早就被卡住了。这些数字是Wii好友代码,如果这有助于你理解这一点的话 我有三张桌子: 用户: id, firstname, surname 游戏: id, title 编号: number, users_id, game_id 号码是属于用户并与游戏关联的唯一代码 我试图找出一个特定游戏的数字列表,以及他们所属的用户的名字 我正在运行查询: SELECT firstname, surname, number FROM games,

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

我有三张桌子:

用户:

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的所有数字。但是,这会返回任何没有此游戏代码的用户,以及来自其他用户的随机代码。如何使此查询只返回实际拥有该游戏代码的用户?

啊-写下这个问题对我很有帮助

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


有什么优化这个的想法吗?

啊-写这个问题对我很有帮助

SELECT firstname, surname, number 
FROM   games, users, numbers 
WHERE  numbers.game_id = games.id AND 
       games.title = 'foogame' AND 
       games.user_id = users.id
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
简单

有什么优化的想法吗

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.id和users.id主键

如果您想要在给定某个用户的所有游戏中搜索数字,您还需要:

CREATE INDEX ix_numbers_users ON numbers (users_id)
要优化,请创建索引:

CREATE INDEX ix_game_title ON games (title)

CREATE INDEX ix_numbers_game ON numbers (game_id, users_id)
当然,还可以使用games.id和users.id主键

如果您想要在给定某个用户的所有游戏中搜索数字,您还需要:

CREATE INDEX ix_numbers_users ON numbers (users_id)

我发现如果你真的使用连接会更容易,因为你不会像第一次那样错过连接条件


内部连接相当于您所做的-它专门限制

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

内部连接相当于您所做的-它专门限制

您需要将数字表的users\u id和game\u id列链接到users和games id列。 只需添加:

AND users_id = users.id
AND game_id = games.id
您也可以使用联接。

您需要将数字表的users\u id和game\u id列链接到users和games id列。 只需添加:

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

你也可以用JOIN来代替。

来跟进Tom的答案。。。如果您是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'

为了跟进汤姆的回答。。。如果您是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'

我建议先从一个改变开始

甚至不要将任何对象或属性称为“数字”

在这种情况下,可以分别调用表和列“game_code”和“games_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

我建议先从一个改变开始

甚至不要将任何对象或属性称为“数字”

在这种情况下,可以分别调用表和列“game_code”和“games_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

您在示例中所做的是笛卡尔积,所有行与其他表中所有其他行的组合相交。您希望在id列上使用联接,以在数据集到达where子句之前减少数据集。@安德鲁:大多数RDBMS品牌都知道如何相同地优化这两种情况。只有在where子句中不添加条件时,它才是笛卡尔积。如果使用联接语法,它更易于维护,因为它还将联接条件与where条件分开。在示例中,您所做的是将所有行与其他表中所有其他行的组合进行交叉的笛卡尔积。您希望在id列上使用联接,以在数据集到达where子句之前减少数据集。@安德鲁:大多数RDBMS品牌都知道如何相同地优化这两种情况。如果不在where子句中添加条件,则这只是笛卡尔积。如果使用联接语法,则更易于维护,因为它还将联接条件与where条件分开。如果尝试学习联接,则可以这样做,然后将INTERNAR更改为不同的左值,右键查看结果集如何变化。如果您试图学习连接,可以这样做,然后将“内部”更改为不同的值左键,右键查看结果集如何变化。