我现在将尝试更好地解释以下问题和查询的目的。假设我们正在谈论电子商务环境和数据库。除其他外,我们有三个表:products、orders 和 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)。
我想对查询做的是检索,给定一个产品 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 的建议。我的查询将返回 ids: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 语法,但性能没有任何变化。查询耗时 0,0022 秒,IN 子句中只有一个产品 ID。性能将随着多个产品 ID 呈指数下降(例如在购物车页面期间,购物篮中有更多产品)。
谢谢。