0

私は次のテーブルを持っています (それらはすべてより多くの列を持っていますが、私は興味のあるものだけを示しています):

Product                         Order details                   Orders
----------------------------    ----------------------------    --------------
| id_product | id_supplier |    | id_order   |  id_product |    |  id_order  |
|     12     |     2       |    |     1      |     56      |    |     1      |
|     32     |     4       |    |     2      |     32      |    |     2      |
|     56     |     2       |    |     2      |     56      |    |     3      |
|     10     |     1       |    |     4      |     56      |    |     4      |
----------------------------    |     3      |     12      |    --------------
                                ----------------------------

私がやりたいことは、1 つまたは複数のサプライヤーのみからの製品を含むすべての注文を選択することです。したがって、ID 2 (id_supplier = 2) のサプライヤーからの製品のみを含むすべての注文が必要であるとしましょう。ID 1、3、および 4 の注文を取得する必要があります。

ID 4 (id_supplier = 4) のサプライヤーからの製品のみを含むすべての注文が必要な場合、空の結果が得られるはずです。

ID 2と4のサプライヤーからの製品のみを含むすべての注文が必要な場合は、ID 2 の注文を取得する必要があります。

次の質問を読みました: mySQL 排他レコードですが、私のように 2 つのテーブルがある場合、そのクエリを理解できません。ここで私を助けるために、もう1組の目が必要です!:)

私がこれをどのように行うかについて何か考えがありますか?

編集:明確にするために、指定された1つ以上のサプライヤーからの製品のみを含むすべての注文を取得したいと思います。指定された以外のサプライヤーからの製品の注文は、含まれるべきではありません。

4

3 に答える 3

1

私がリストした質問によると、これはあなたが望むものであり、左の参加で行うことができると思います。

select 
      od.id_order,
      sum( if( p.id_supplier in ( 2, 4 ), 1, 0 )) as HasSupplierLookingFor,
      sum( if( p.id_supplier in ( 2, 4 ), 0, 1 )) as HasOtherSuppliers
   from
      order_Details od
         join product p
            on od.id_product = p.id_product
   group by
      od.id_order
   having 
          HasSupplierLookingFor > 0
      AND HasOtherSuppliers = 0

場合によっては、提示されたとおりに多少あいまいな質問に答えるだけで、誤った答えが返されることがあります。このクエリは、注文ごとに、製品に参加してサプライヤを検索し、注文IDでグループ化します。

注文された製品ごとに、最初のSUM()は、探しているサプライヤの1つであるかどうかを尋ねます。そうである場合は、値の合計を1にします。それ以外の場合は、0です。次のSUM()は、同じことを求めます。それはサプライヤーであり、ゼロを使用します。したがって、他のすべてのサプライヤーは1を取得します。

したがって、現在、HAVING条項は、少なくとも1つのサプライヤが適格であり、他のサプライヤが代表されていない注文を探しています。

したがって、30個のアイテム、サプライヤ2から20個、サプライヤ4から10個のアイテムを注文できます。HasSupplierLookingForは30、HasOtherSuppliers = 0の場合、注文が含まれます。

別の注文には5つのアイテムが含まれる可能性があります。1つはサプライヤ2から、他の4つはサプライヤ9からです。これはHasSupplierLookingFor = 1、HasOtherSuppliers = 4であるため、これを適格な注文として除外します。

于 2012-04-16T15:33:30.850 に答える
0

次のように、これらすべてのテーブルを内部結合する必要があります。

SELECT o.* from Orders o
   INNER JOIN Details d ON o.id_order = d.id_order
   INNER JOIN Products p ON d.id_product = p.id_product
   WHERE p.id_supplier = 4

それはあなたにその供給者からの製品を含む注文を与えるでしょう。

于 2012-04-16T14:47:48.127 に答える
0
SELECT o.id_order
FROM Orders o 
    INNER JOIN `Order details` od
        ON o.id_order = od.id_order
    INNER JOIN Product p
        ON p.id_product = od.id_product
WHERE p.id_supplier IN (2,4)

(2,4)は、取得するサプライヤです。(2)と言うことで1つだけを求めることもできます

于 2012-04-16T14:48:19.173 に答える