具有计数条件和连接的MYSQL选择查询

时间:2014-12-02 18:51:39

标签: mysql sql

我想知道以下查询之间的区别。两者都返回相同的值。我对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'

2 个答案:

答案 0 :(得分:0)

第二个查询更有效。并使用内部联接。第一个用于子查询。子查询不需要验证类别是否存在。显示相同的结果但在优化点上第二次查询更有效。

在考虑第一个查询时

(     SELECT count(*)     来自categories     在productscategory_id = categoriesidslug ='围裙'   )&gt; = 1

此部分是针对每个产品记录执行的。只需对产品表中的每条记录迭代类别。

答案 1 :(得分:-1)

第一个查询将更有效,因为不需要连接表。您可能没有注意到执行时间的巨大差异,但如果表格更大,您会注意到第一个查询返回的速度要快得多。

内部联接将基于两个表中具有值的行组合两个表。换句话说,结果表中不会有任何空值。