MYSQL选择带计数条件的查询并连接

MYSQL选择带计数条件的查询并连接,mysql,sql,Mysql,Sql,我想知道以下查询之间的区别。两者都返回相同的值。我对内部连接有想法,但我不明白第一个查询如何返回相同的值 SELECT * FROM `products` WHERE ( SELECT count(*) FROM `categories` WHERE `products`.`category_id` = `categories`.`id` AND `slug` = 'aprons' ) >= 1 AND `slug` <> 'pr

我想知道以下查询之间的区别。两者都返回相同的值。我对内部连接有想法,但我不明白第一个查询如何返回相同的值

SELECT  *
FROM 
  `products`
WHERE
  (
    SELECT count(*) 
    FROM `categories`
    WHERE `products`.`category_id` = `categories`.`id` AND `slug` = 'aprons'
  ) >= 1 
  AND `slug` <> 'products-1'

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


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

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

思考第一个问题时

选择计数* 从类别 其中products.category_id=categories.id,slug=围裙 >=1


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

第一个查询几乎肯定不会达到您的目的。子查询返回值并没有改变返回的产品行,而是一个开关。p、 感谢@Michaelth的代码重新格式化。第一个查询是执行一个子查询,以查看结果集中的任何类别是否有一小块围裙,并且只返回那些值sans-products-1。第二种方法是进行相同的筛选,但作为一个整体,只获取与categories表相关的记录,并且没有一点问题。本质上,他们在做相同的过滤,但方式不同。但是内部连接查询的性能要高得多,因为它不必对每个记录都运行子查询。很抱歉,但我不同意您的第一点,即对每个记录使用子查询比使用连接更有效,其中a不必以那种方式对每个记录进行迭代,而b则进行了彻底的优化,因为这正是它想要做的。我想我应该在回答之前做更多的研究。然而,在我使用Oracle的经验中,我注意到在大型、未排序、未筛选的表上,子查询通常会胜出。我在执行第一个查询时感到困惑,因为我单独执行子查询,返回值为3。然后我将返回的值替换到子查询的位置。但结果与旧查询不同,这是因为该查询针对resultset中的每个记录运行。用其中一条记录的结果替换子查询不会得到相同的结果。
SELECT products.* 
FROM 
  products
  INNER JOIN categories ON categories.id = products.category_id
WHERE 
  products.slug <> 'products-1'
  AND categories.slug = 'aprons'