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