我现在将尝试更好地解释以下问题和疑问的目的。假设我们讨论的是电子商务环境和数据库。除其他外,我们还有三个表:产品、订单和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,其中至少有一个是给定的产品ID。
为了语义起见,我将报告一个例子。让我们假设我们在ORDERS_DATA中有这些行:
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我已经使用了内部联接语法,但是性能没有任何变化。查询耗时0,0022秒,在in clausole中只有一个产品id。使用多个产品id (例如,在购物车页面中,篮子中有更多的产品),性能将大大降低。
谢谢。
发布于 2012-11-26 15:02:04
尝试用一个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_producthttps://stackoverflow.com/questions/13552044
复制相似问题