“LEFT JOIN AND”和“LEFT JOIN WHERE”哪个更好

时间:2014-08-16 10:01:10

标签: mysql

订单

id
name

ORDER_DETAILS

id
name
type
order_id

如果我想计算类型为1的订单详细信息,哪个sql语句更好更有效

A

SELECT
    `orders`.`name`
FROM
    `orders`
LEFT JOIN `order_details` ON `order_details`.`order_id` = `order`.`order_id`
WHERE
    `order_details`.`type` = 1
GROUP BY `orders`.`id`

SELECT
    `orders`.`name`
FROM
    `orders`
LEFT JOIN `order_details` ON `order_details`.`order_id` = `order`.`order_id` AND `order_detail`.`type` = 1
GROUP BY `orders`.`id`

3 个答案:

答案 0 :(得分:2)

将条件放入where子句会将left join变为inner join

为什么呢?因为您过滤了where子句中的数据。但是在联接的on条件下,您只需定义要加入的内容。

答案 1 :(得分:1)

使用LEFT JOIN的原因是结果将包含第一个表中第二个表中没有匹配项的行。因此,您必须将第二个表中的所有条件放入ON子句中。如果将其放入WHERE子句中,它将过滤掉所有没有匹配的行,因为在order_details.type行中NULL将是= 1,显然不是IFNULL(COUNT(order_details.someColumn), 0)

此外,如果您计算匹配项,则需要使用COUNT(*)而不是COUNT(*)。如果您使用1,那么对于没有匹配的行,您将获得orders,因为结果中仍有一行包含来自NULLorder_details的所有数据order_details列。通过计算{{1}}表中的列,将不计算空值。

答案 2 :(得分:0)

我认为无论你使用“LEFT JOIN AND”和“LEFT JOIN WHERE”

对于批量数据,您必须具有适当的索引才能更快地获得结果。