我使用的是mysql,这是一个我很快编写的查询,但我觉得可以使用JOIN进行优化。这是一个例子btw.
users table:
id user_name first_name last_name email password
1 bobyxl Bob Cox bob@gmail.com pass
player table
id role player_name user_id server_id racial_name
3 0 boby123 1 2 Klingon
1 1 example 2 2 Race
2 0 boby2 1 1 Klingon
SQL
SELECT `player`.`server_id`,`player`.`id`,`player`.`player_name`,`player`.`racial_name`
FROM `player`,`users`
WHERE `users`.`id` = 1
and `users`.`id` = `player`.`user_id`
我知道我可以使用左联接,但有什么好处
SELECT `player`.`server_id`,`player`.`id`,`player`.`player_name`,`player`.`racial_name`
FROM `player`
LEFT JOIN `users`
ON `users`.`id` = `player`.`user_id`
WHERE `users`.`id` = 1
有什么好处,我用乙醚的方法得到了同样的结果。
您的查询中有一个JOIN
SELECT `player`.`server_id`,`player`.`id`,`player`.`player_name`,`player`.`racial_name`
FROM `player`
INNER JOIN `users` ON `users`.`id` = `player`.`user_id`
WHERE `users`.`id` = 1
使用左联接的唯一原因是,即使用户表中没有匹配项,也要从玩家表中获取数据。
LEFT JOIN将从左侧表中获取数据,即使右侧表中没有相等的数据。我想,在某一点上,玩家表的数据将不等同于用户表,特别是如果用户表上的数据没有插入到玩家表中。
如果第二个表(播放器)没有对应于users表的等效数据,则第一个查询可能返回null。
此外,对于IMHO来说,为服务器设置另一个表对于遵守数据库结构中的规范化规则是一个好主意。毕竟,server_id的详细信息是播放器表上指向的列。
第一个解决方案生成一个直接产品(获取并连接所有东西),然后丢弃坏结果。如果你有很多行,这将非常慢!
左联接首先得到左表,然后只放右边的匹配行(或null)。
在您的示例中,您甚至不需要加入。:)这会给你同样的结果,在你检查用户id:之前,它会很好
SELECT `player`.`server_id`,`player`.`id`,`player`.`player_name`,`player`.`racial_name`
FROM `player`
WHERE `player`.`user_id` = 1
如果你想要更多的条件,另一个解决方案可能是这样的:
SELECT * FROM player WHERE player.user_id IN (SELECT id FROM user WHERE ...... )