3

与我的上一个问题(MySQLi 性能,多个(单独的)查询与子查询)相关,我遇到了另一个问题。

有时我使用子查询从另一个表中选择值(例如,连接到 ID 的用户名),但我不确定 select-in-select,因为它似乎不是很干净而且我不确定性能。

子查询可能如下所示:

SELECT
    (SELECT `user_name` FROM `users` 
     WHERE `user_id` = table2.user_id) AS `user_name`
    , `value1`
    , `value2`
FROM
    `table2`
....

对 table1 的结果使用单独的查询,对 table2 的结果使用另一个查询会“更好”(双倍连接,但不需要跨表),还是我什至应该使用 JOIN 在单个查询中获取结果?

我对 JOIN 和子查询还没有太多经验,所以我不确定在这种情况下 JOIN 是否会“太多”,因为我真的只需要一个连接到 ID 的名称(或者可能计算表中的行),或者如果它无关紧要,因为 select-in-select 也被视为某种 JOIN..

使用 JOIN 的解决方案可能如下所示:

SELECT
    users.user_name , table2.value1, table2.value2
FROM
    `table2`
INNER JOIN
    `users`
ON
    users.user_id = table2.user_id
....

如果我更喜欢 JOIN,在这种情况下哪一个最好:左连接、内连接还是其他?

4

1 回答 1

6

您询问是否使用inner joinleft join确实表明您没有使用它们做太多工作。

这两者的用途完全不同,inner join用于从两个或多个表中返回一些列具有匹配值的列。left join当您希望连接子句中指定的表中的行即使在其他表中没有匹配列时也能返回时使用。这取决于您的应用程序。如果一张表有球员的姓名,而另一张表包含他们支付的罚金的详细信息,那么您肯定会想使用left join, 来计算没有罚分的球员,因此在第二张桌子上没有记录。

关于是否使用 subquery 或joinjoins 在正确使用时可以快得多。的意思是,当连接列上有索引时,表是按包含行数的递增顺序指定的(通常。可能有例外),连接列具有相似的数据类型等。如果所有这些条件匹配,join会是更好的选择。

于 2012-08-21T17:13:50.747 回答