2

我现在将尝试更好地解释以下问题和查询的目的。假设我们正在谈论电子商务环境和数据库。除其他外,我们有三个表: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 呈指数下降(例如在购物车页面期间,购物篮中有更多产品)。

谢谢。

4

1 回答 1

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
于 2012-11-26T15:02:04.270 回答