Mysql 如何按子表中的多条记录计数重复项

Mysql 如何按子表中的多条记录计数重复项,mysql,Mysql,假设我有以下表格结构: products id | name | price products_ean id | product_id | ean 一个产品可能(不幸地)有多个EAN编号。两个产品可以有一个或多个相同的EAN编号 通过比较products\u EAN表中的多个EAN编号来计算重复产品数量的最佳做法是什么 我尝试过以下方法,但这会使查询速度变慢: SELECT `products`.`name`, ( SELECT COUNT(*) FROM `products_ean

假设我有以下表格结构:

products
id | name | price

products_ean
id | product_id | ean
一个产品可能(不幸地)有多个EAN编号。两个产品可以有一个或多个相同的EAN编号

通过比较products\u EAN表中的多个EAN编号来计算重复产品数量的最佳做法是什么

我尝试过以下方法,但这会使查询速度变慢:

SELECT
`products`.`name`,
(
SELECT
  COUNT(*)
FROM
  `products_ean`
WHERE
  `ean` IN(
  SELECT
    `ean`
  FROM
    `products_ean`
  WHERE
    `product_id` = `products`.`id`
) AND `products_ean`.`product_id` != `products`.`id`
GROUP BY `product_id`
) AS `ProductEANCount`
FROM
`products`
LIMIT 12

使用联接是生成相关信息的最简单方法。我使用了
GROUP BY
product.id,这意味着
eans
是聚合字段,因为它们是唯一可以复制的字段。我在查询后添加了
HAVING
part,以仅选择那些包含2个或更多的结果(可选)


在查询效率方面,将product\u id、ean作为
products\u ean
表的复合主键可能是最有效的。因为这是唯一的,所以不清楚为什么需要
products\u ean.id
列。

使用联接是生成相关信息的最简单方法。我使用了
GROUP BY
product.id,这意味着
eans
是聚合字段,因为它们是唯一可以复制的字段。我在查询后添加了
HAVING
part,以仅选择那些包含2个或更多的结果(可选)


在查询效率方面,将product\u id、ean作为
products\u ean
表的复合主键可能是最有效的。因为这是唯一的,所以不清楚为什么需要
products\u ean.id
列。

我猜OP是在试图找到那些存在于多个产品中的
ean
值?我没有这样读,但是没有指定输出<代码>组连接(ean)作为ean列表可以添加到
选择
结果中。可能是其他方法;ean上的group_concat(产品id)和group by。但我会等待OP的进一步澄清。查询工作正常,但不幸的是它仍然非常慢(14秒)。为了澄清一些不确定性:1)1产品在products\u EAN表中永远不会有相同的EAN(因此product\u id+EAN是唯一的)2)我不希望检索已找到的EAN,只需计数就足够了我在
产品\u id
+
EAN
上有一个唯一索引,在
EAN
上有一个常规索引。我忘记提到的一个(相当)重要的领域是“webshop_id”。产品也不会有相同网店id的相同EAN(抱歉,我忘了在前面提到这个)@danblack one优化我能想到的是将
左连接
更改为
连接
。OP澄清了这一点。因此+1我猜OP正在尝试查找存在于多个产品中的
ean
值?我没有这样读,但是没有指定输出<代码>组连接(ean)作为ean列表可以添加到
选择
结果中。可能是其他方法;ean上的group_concat(产品id)和group by。但我会等待OP的进一步澄清。查询工作正常,但不幸的是它仍然非常慢(14秒)。为了澄清一些不确定性:1)1产品在products\u EAN表中永远不会有相同的EAN(因此product\u id+EAN是唯一的)2)我不希望检索已找到的EAN,只需计数就足够了我在
产品\u id
+
EAN
上有一个唯一索引,在
EAN
上有一个常规索引。我忘记提到的一个(相当)重要的领域是“webshop_id”。产品也不会有相同网店id的相同EAN(抱歉,我忘了在前面提到这个)@danblack one优化我能想到的是将
左连接
更改为
连接
。OP澄清了这一点。因此+1您是否正在尝试查找存在于多个产品中的ean值?一些示例数据和预期输出将非常有用。您是否正在尝试查找存在于多个产品中的ean值?一些示例数据和预期输出将非常有用。
SELECT p.id, name, price, count(ean) as eans
FROM products p
JOIN products_ean e
  ON p.id = e.product_id
GROUP BY p.id
HAVING eans >= 2