Mysql 连接而不是子选择

Mysql 连接而不是子选择,mysql,sql,join,subquery,Mysql,Sql,Join,Subquery,子选择的性能不如连接,这是真的吗 我收到了这个问题 SELECT categories_id, products_id FROM products_to_categories a WHERE date_added = ( SELECT MIN(date_added) FROM products_to_categories b WHERE a.products_id = b.products_id ) AND categories_id

子选择的性能不如连接,这是真的吗

我收到了这个问题

SELECT   categories_id,
         products_id
FROM     products_to_categories a
WHERE    date_added = (
  SELECT MIN(date_added)
  FROM   products_to_categories b
  WHERE a.products_id = b.products_id
)
AND      categories_id != 0
GROUP BY products_id

并希望将其更改为具有JOIN的查询。

是的,子查询更需要处理,因为子查询周围的每个查询都需要等待,直到该子查询完成处理。连接不一定是这样

您需要有关联接语法的帮助吗?还是我的回答就是你所需要的

以下是您要查找的内容:

SELECT   a.categories_id,
         a.products_id
FROM     products_to_categories a
LEFT JOIN     products_to_categories b
  ON     a.products_id = b.products_id
WHERE    a.date_added = MIN(b.date_added)
  AND      a.categories_id != 0
GROUP BY a.products_id, a.categories_id
将其切换到没有子查询或聚合的联接并不明显

其思想是在添加条件的日期上使用条件进行左外连接。如果此条件不匹配,则您具有最小值:

SELECT categories_id, products_id
FROM  products_to_categories a left outer join
      products_to_categories b
      on a.products_id = b.products_id and
         b.date_added < a.date_added
WHERE b.date_added is null and a.categories_id != 0;
子选择的性能不如连接,这是真的吗

可能吧。这完全取决于所讨论的查询。许多经常通过子查询实现的构造(也可以通过联接轻松实现)实际上是由查询优化器作为联接在内部执行的。。。在具有企业级查询优化器的数据库系统中,如SQL Server和Oracle。MySQL的查询优化器在这类优化方面尤其糟糕,您必须查看explain输出,看看它是否足够智能,适合您的具体情况。它甚至可以决定不应用此优化,即使它看到它,因为系统负载足够低,优化将比只执行较慢的版本慢

即使它作为子查询执行,也取决于查询本身和系统负载。子查询可能会导致更快的锁升级,可能会导致表锁,因此在同一个表上同时执行更多查询的情况下,执行速度会变慢。如果没有并发性,额外的锁不会导致明显的额外减速


一般来说,尽可能使用连接而不是子查询,但不要过度使用-子查询通常执行得非常好,查询优化器将很好地保持服务器的活动状态。但也要记住,MySQL并不完全是一个“企业级RDBMS”,因此在优化方面可能相当愚蠢。

是的,我在同一个表上尝试了左连接,但它不起作用。在WHERE clauseGood catch中不能有聚合函数!@RonnyLinsener知道这一点吗?他会想再看看他的逻辑…这是我以前尝试过的,但我得到了这个错误1052-字段列表中的“categories_id”列是模糊的我刚刚修改过,SELECT列需要前缀a。现在我得到1111-组函数的无效使用这是MySQL的问题吗?我的SQL是用于SQLServerWhere子句中不能有聚合函数当我添加别名时,您的想法有效。但是我得到的resultst比我的subselect多。我认为如果某些产品的date_added一致为空,可能会出现这种情况。我需要添加MINdate_,因为当有两个以上的条目时,它将使用中间的条目,而不是最旧的条目。
Select products_to_catergoriesa.categories_id, 
products_to_catergoriesa.products_id, min(products_to_categories b.date_added)

from products_to_categories a
join products_to_categories b 
on products_to_categories b.products_id = products_to_categories a.product_id

where [table_name_here].catergory_id !=0
SELECT categories_id, products_id
FROM  products_to_categories a left outer join
      products_to_categories b
      on a.products_id = b.products_id and
         b.date_added < a.date_added
WHERE b.date_added is null and a.categories_id != 0;