我有两个表:
products product_eans
+--+-----------+ +----------+-------------+
|id|name | |product_id|ean |
+--+-----------+ +----------+-------------+
| 1|hello world| | 1|4053804303361|
+--+-----------+ +----------+-------------+
| 2|hello mars | | 1|4053804304788|
+--+-----------+ +----------+-------------+
| 2|4053804304825|
+----------+-------------+
我现在想要计算名称或 EAN 之一中包含字符串 4788 的(唯一)产品。示例中的结果将为 1(一种产品的 EAN 包含搜索字符串 4788)
我已经解决了这个问题
SELECT
COUNT(DISTINCT products.id) AS count
FROM
products
WHERE
products.name LIKE "%4788%" OR
(SELECT
GROUP_CONCAT(ean)
FROM
product_eans
WHERE
product_id = product.id) LIKE "%4788%"`
但是两个表中都有数千行,慢令人难以置信。
像这样的查询最有效的方法是什么?
最佳答案
使用“双端通配符”永远不会很快,因为您不会使用索引,因此将扫描表。内部联接可能是最有效的
SELECT COUNT(DISTINCT e.products_id)
FROM product_eans e
inner join products p on e.products_id = p.id
WHERE e.ean LIKE '%4788%'
OR p.name LIKE '%4788%'
但另一种可能性是通过使用如下联合查询来避免 tha wheer 子句中的 OR:
SELECT
COUNT(*)
FROM (
SELECT
product_id
FROM product_eans
WHERE ean LIKE '%4788%'
UNION
SELECT
id
FROM products
WHERE name LIKE '%4788%'
) d
关于MySQL 计算多个表中的唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47481441/