3

我有一个名为“survey_product”的表,其结构如下:

id int(11)
order_id int(11)
product_id int(11)
pq1 varchar(2)
pq2 varchar(2)
pq3 varchar(2)

此表存储通过系统订购的产品。

以下是该表中的一些数据记录:

(1, 2, 20, '1', '1', 'y')
(2, 2, 21, '1', 'y', 'y')
(3, 2, 22, '1', 'y', 'n')
(4, 2, 23, '1', 'y', 'y')
(5, 2, 24, '1', 'n', 'y')
(6, 3, 20, '1', 'n', 'y')
(7, 3, 24, '1', 'n', 'y')
(8, 3, 25, '1', 'n', 'y')
(9, 4, 20, '1', 'n', 'y')
(10, 4, 21, '1', 'n', 'y')
(11, 4, 23, '1', 'n', 'y')
(12, 4, 24, '1', 'n', 'y')

上面我们有 3 个订单(order_id 2、3 和 4)。

我需要为所有具有 product_id = 21 但不是 product_id = 20 的订单获取 order_id(订单中的其他 product_id 无关紧要 - 我只对 21 和 20 感兴趣)。

然后我需要知道同时具有 product_id 20 和 21 的订单(同样,订单中的其他产品无关紧要)。

这是立即拉取特定产品的所有订单的基本查询:

SELECT order_id FROM survey_product 
WHERE product_id = 20
AND (pq1 = '1' OR pq1 = '2' OR pq1 = '3')

关于如何实现这一目标的任何想法?

我试过了

SELECT order_id FROM survey_product 
WHERE product_id IN (20) AND product_id NOT IN (21)
AND (pq1 = '1' OR pq1 = '2' OR pq1 = '3')

但它也排除了所有其他值。

非常感谢。

4

2 回答 2

4

在这种情况下,使用 JOIN 而不是嵌套查询通常是有益的:

    SELECT sp.order_id
      FROM survey_product AS sp
 LEFT JOIN 
           (SELECT order_id FROM survey_product WHERE product_id = 20) AS sp_t
        ON sp.order_id = sp_t.order_id
     WHERE sp_t.order_id IS NULL
       AND sp.product_id = 21
       AND sp.pq1 IN ('1', '2', '3')

获得order_id20 和 21 in的查询product_id是相似的:您只需使用 INNER JOIN而不检查sp_t.order_id. 或者只是保持原样,但如果你很懒,请替换为 - 但我想那会运行得更慢IS NULLIS NOT NULL)

这是一个可以使用的SQL 小提琴

于 2012-06-23T14:59:26.837 回答
3

我通常通过在 WHERE 条件下使用嵌套查询来做到这一点:

SELECT order_id
FROM survey_product
WHERE product_id = 21
AND pq1 IN ('1', '2', '3')
AND order_id NOT IN (
    SELECT order_id 
    FROM survey_product
    WHERE product_id = 20)

基本上,您从 where 行中找到所有order_ids,product_id = 20然后将它们从主查询中排除,即您order_id从 whereproduct_id = 21但不在order_id子查询产生的 s 中的行中选择 s。

于 2012-06-23T14:41:29.097 回答