我正在设计一个网站,教我自己如何在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的所有数字。但是,这会返回任何没有此游戏代码的用户使用来自其他用户的随机代码。如何使此查询仅返回实际拥有该游戏代码的用户?
答案 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.id
和users.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_id
和game_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'