订单
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`
答案 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
,因为结果中仍有一行包含来自NULL
和order_details
的所有数据order_details
列。通过计算{{1}}表中的列,将不计算空值。
答案 2 :(得分:0)
我认为无论你使用“LEFT JOIN AND”和“LEFT JOIN WHERE”
对于批量数据,您必须具有适当的索引才能更快地获得结果。