我现在将尝试更好地解释以下问题和查询的目的是什么。 我们假设我们正在讨论电子商务环境和数据库。我们有三个表:产品,订单和orders_data。 ORDERS表将处理所有已下订单和一个子表,我们称之为ORDERS_DATA将存储订单中记录的所有产品。
按照表格定义,我的问题没有那些无用的字段:
ORDERS (*id*, date, totale, ...);
ORDERS_DATA (id_order, id_product, ...);
PRODUCTS (id, name, ...);
ORDERS 中的主键是 id ,而在ORDERS_DATA中,键是(id_order,id_product)。
对于查询,我想要检索的是 PRODUCT ID (在产品页面或购物车页面上浏览时),建议的产品基于ORDERS_DATA表。该查询将返回所有生活在这些订单中的id_product,其中至少有一个产品是给定的 PRODUCT ID
为了简洁起见,我将举例说明。假设我们在ORDERS_DATA中有这些ROW:
R1(1, 1); R2(1, 2); R3(1, 3); R4(2, 2), R5(2, 5); R6(3, 3);
我想要产品ID = 2的建议我的查询将返回ID:1和3(来自R1和R3 - 它们共享相同的订单ID,此订单还有产品2 - 来自R2 - 顺便提一下其产品)和产品5归功于订单号2.订单号3将被忽略。
这是我写的查询,但我很确定它不是性能和风格上最好的。
SELECT
A.id_product, COUNT( A.id_product ) AS num
FROM
orders_data A, orders_data B
WHERE
A.id_order = B.id_order
AND B.id_product IN (*IDs-HERE*)
AND A.id_product NOT IN (*IDs-HERE*)
GROUP BY A.id_product
我已经使用了INNER JOIN语法,但性能没有任何变化。 查询在IN claumole中只有一个产品ID,需要0,0022秒。性能将随着多个产品ID而呈指数下降(例如在购物车页面中,产品中包含更多产品)。
感谢。
答案 0 :(得分:0)
尝试使用JOIN
测试替换EXISTS
:
SELECT
id_product,
COUNT(1) As num
FROM
orders_data As A
WHERE
id_product NOT IN (*IDs HERE*)
And
Exists
(
SELECT 1
FROM orders_data As B
WHERE B.id_order = A.id_order
And B.id_product IN (*IDs HERE*)
)
GROUP BY
id_product