我想知道以下查询之间的区别。两者都返回相同的值。我对INNER JOIN有所了解,但我无法理解第一个查询如何返回相同的值。
SELECT *
FROM
`products`
WHERE
(
SELECT count(*)
FROM `categories`
WHERE `products`.`category_id` = `categories`.`id` AND `slug` = 'aprons'
) >= 1
AND `slug` <> 'products-1'
SELECT products.*
FROM
products
INNER JOIN categories ON categories.id = products.category_id
WHERE
products.slug <> 'products-1'
AND categories.slug = 'aprons'
答案 0 :(得分:0)
第二个查询更有效。并使用内部联接。第一个用于子查询。子查询不需要验证类别是否存在。显示相同的结果但在优化点上第二次查询更有效。
在考虑第一个查询时
(
SELECT count(*)
来自categories
在products
。category_id
= categories
。id
和slug
='围裙'
)&gt; = 1
此部分是针对每个产品记录执行的。只需对产品表中的每条记录迭代类别。
答案 1 :(得分:-1)
第一个查询将更有效,因为不需要连接表。您可能没有注意到执行时间的巨大差异,但如果表格更大,您会注意到第一个查询返回的速度要快得多。
内部联接将基于两个表中具有值的行组合两个表。换句话说,结果表中不会有任何空值。