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 の両方を取得するクエリ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)

基本的にorder_id、行 where からすべてのを検索しproduct_id = 20、それらをメイン クエリから除外します。order_idproduct_id = 21order_id

于 2012-06-23T14:41:29.097 に答える