注意:警惕使用 EAV(实体、属性、值)表设计的设计。由于参照完整性和查询复杂性的原因,它们往往变得非常难以处理。
通过使用进行优化:
- 加入而不是子选择。
- 加入符号。
- 所有列名上的显式表别名。
阶段1:
SELECT e.attr_id, e.sku, a.value
FROM product_attr AS e JOIN product_attr_text AS a
ON e.attr_id = a.attr_id
WHERE a.value IN (
SELECT p.value
FROM product_attr_text AS p
JOIN eav_attr AS v ON p.attribute_id = v.attribute_id
WHERE v.attribute_code = 'similar_prod_id'
AND p.value != ''
GROUP BY value
HAVING (COUNT( value ) > 1)
)
阶段2:
SELECT e.attr_id, e.sku, a.value
FROM product_attr AS e
JOIN product_attr_text AS a ON e.attr_id = a.attr_id
JOIN (SELECT p.value
FROM product_attr_text AS p
JOIN eav_attr AS v ON p.attribute_id = v.attribute_id
WHERE v.attribute_code = 'similar_prod_id'
AND p.value != ''
GROUP BY value
HAVING (COUNT( value ) > 1)
) AS x ON x.value = a.value