Php SQL优化vs连接的位置

Php SQL优化vs连接的位置,php,mysql,sql,database,Php,Mysql,Sql,Database,我使用的是mysql,这是一个我很快编写的查询,但我觉得可以使用连接对其进行优化。顺便说一句,这是一个例子 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

我使用的是mysql,这是一个我很快编写的查询,但我觉得可以使用连接对其进行优化。顺便说一句,这是一个例子

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` 
LEFT JOIN `users` 
ON `users`.`id` =  `player`.`user_id`
WHERE `users`.`id` = 1

好处是什么,我以同样的方式获得相同的结果。

您的查询有一个连接。这与写作是一样的:

选择“玩家”.“服务器id”.“玩家id”.“玩家”.“玩家名称”.“玩家”.“种族名称” 从`玩家` 在“users”上的内部联接“users”。`id`=`player`.`user\u id` 其中`users`.`id`=1
使用左联接的唯一原因是,即使在用户表中没有匹配项的情况下,也希望从播放器表中获取数据

您的查询中有一个联接。这与写作是一样的:

选择“玩家”.“服务器id”.“玩家id”.“玩家”.“玩家名称”.“玩家”.“种族名称” 从`玩家` 在“users”上的内部联接“users”。`id`=`player`.`user\u id` 其中`users`.`id`=1
使用左联接的唯一原因是,即使在用户表中没有匹配项的情况下,也希望从播放器表中获取数据

LEFT JOIN将从左侧表中获取数据,即使右侧表中没有相同的数据。 我猜在某一点上,如果用户表上的数据没有被插入到播放器表中,那个播放器表的数据将不等同于用户表

如果第二个表播放器没有对应于users表的等效数据,则第一个查询可能返回null


此外,IMHO,为服务器设置另一个表对于遵守数据库结构中的规范化规则来说是一个好主意。毕竟,player表上的列所指向的服务器id的详细信息是什么。

LEFT JOIN将从左侧表获取数据,即使右侧表中没有相同的数据。 我猜在某一点上,如果用户表上的数据没有被插入到播放器表中,那个播放器表的数据将不等同于用户表

如果第二个表播放器没有对应于users表的等效数据,则第一个查询可能返回null


此外,IMHO,为服务器设置另一个表对于遵守数据库结构中的规范化规则来说是一个好主意。毕竟,player表上的列所指向的服务器id的详细信息是什么。

第一个解决方案是直接生成一个产品,并将所有内容与所有内容连接起来,然后删除坏结果。如果你有很多行,这将是非常缓慢的

左联接首先获取左表,然后仅放置右或空的匹配行

在您的示例中,您甚至不需要加入: 这将为您提供相同的结果,在您检查用户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 ...... )

第一种解决方案是直接生成一个产品,并将所有内容与所有内容连接起来,然后去掉不好的结果。如果你有很多行,这将是非常缓慢的

左联接首先获取左表,然后仅放置右或空的匹配行

在您的示例中,您甚至不需要加入: 这将为您提供相同的结果,在您检查用户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 ...... )

玩家表将为每个用户提供多个字符。是的,但是如果用户之间存在匹配。id=player.user_id,则在这种情况下,您将始终从内部联接和左联接获得相同的信息。请参见此处,以获取差异的快速示例@克里斯。如果在users.id=player.user\u id中始终有匹配项,则每个用户拥有多个玩家不会改变任何事情。在这种情况下,您可以使用内部联接。@CrisG。在左边的连接中,您可以获得玩家,即使他们不属于该用户。这就是为什么我说你想要一个内在的结合。关于什么是左连接,请参阅。谢谢,您在第三个查询中讨论的是空值,玩家3没有字符正确吗?玩家表将为每个用户提供多个字符。是的,但是如果用户之间存在匹配。id=player.user_id,则在这种情况下,您将始终从内部联接和左联接获得相同的信息。请参见此处,以获取差异的快速示例@克里斯。如果在users.id=player.user\u id中始终有匹配项,则每个用户拥有多个玩家不会改变任何事情。在这种情况下,您可以使用内部联接。@CrisG。在左边的连接中,您可以获得玩家,即使他们不属于该用户。这就是为什么我说你想要一个内在的结合。关于什么是左连接,请参阅。谢谢,您在第三个查询中讨论的是空值,玩家3没有字符正确吗?编辑问题:播放器表将为每个用户提供多个字符。然后,使用联接就越重要。编辑问题:播放器表将为每个用户提供多个字符。然后
更重要的是使用连接。你能用嵌套的select进一步解释这一点吗?是的,但是你想知道什么?嵌套的一个选择并返回您想要的所有用户id,只需给它一个条件,然后外部的一个通过该用户id列表选择玩家。类似的例子:你能用嵌套的SELECTYeah进一步解释一下吗?但是你想知道什么?嵌套的一个选择并返回您想要的所有用户id,只需给它一个条件,然后外部的一个通过该用户id列表选择玩家。类似的例子: