2012-04-16 2 views
0

私は以下の表を持っている(彼らはすべてのより多くの列を得たが、私はちょうど興味のあるものを示しています):私は何をしたいか独占mysqlの選択クエリ、二つのテーブル

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 4(id_supplier = 4)のサプライヤから空の結果が得られるはずです。

私はONLYは、私は、次の質問を読んだ2

私はidの順序を取得する必要があります2 4 idのサプライヤーからの製品持っていることをすべての注文したい場合:mySQL exclusive recordsをしかし私ができます私が持っているような2つのテーブルを持っているときに、そのクエリーを把握することはできません。私はここで私を助けるためにもう一組の目が必要です! :)

どうすればいいですか?

EDIT:clearifyするために、私は1つ以上の指定のサプライヤーからの製品が含まれているすべての注文を取得したいです。指定されていない他のサプライヤーからの製品を使用した注文は含まれません。

+0

明確化...サプライヤの条件= 4はid_product = 32(id_supplier 4)で注文ID 2を返すべきです(SHOULD)。次に、サプライヤ2と4を参照してください。これは2つの異なることを意味します。 ONE - サプライヤが2または4のいずれかの注文... TWO - 製品が最低でも2つのサプライヤによって表されなければならないすべての注文。したがって、1つの注文Xにサプライヤ2だけがあった場合、注文Yにはサプライヤ4だけがありますが、注文Zにはサプライヤ2とサプライヤ4の両方の製品があり、注文Zを見たいと思います。 – DRapp

+0

はい、正確です。私はそれがANDでなければならないことを明確にすべきだった。サプライヤー2と4が指定されている場合、そのサプライヤーからの製品のみを注文に含める必要があります。 – Bazze

+0

それで、リストに載っているものは1つだけです...サプライヤがどこにいても...どちらか一方、あるいは両方、あなたのクエリに適格であるとしてその注文を含めることができます...既存の答えはあなたのためにそれを処理する必要があります。 – DRapp

答えて

1

私がリストした質問ごとに言って1だけを求めることができます、これはあなたが望んでいると思う、そしてLEFT結合で行うことができます。

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句は、他のサプライヤーに代わって

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

別の注文には5つのアイテムが含まれています。サプライヤ2からの1つ、サプライヤ9からの4つの他のもの。これはHasSupplierLookingFor = 1、HasOtherSuppliers = 4を持つため、これを修飾された注文として除外します。

+0

これは純粋な芸術です。ご協力いただきありがとうございます。また、徹底的に質問を説明していただきありがとうございます。 – Bazze

0

joinを使用してください。

INNER JOINのは、すべての行 LEFTとRIGHTのためであるあなたは、このように、すべてのそれらのテーブルを内部結合する必要があります

0

のみ(nullでない)行について、何が必要です登録しよう:

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 

それはそのサプライヤーからの製品を含む注文をあなたに与えるでしょう。

+0

残念ながら、これはトリックをしません。注文は、異なるサプライヤーの製品をたくさん持つことができます。私が望むのは、1つまたは複数の特定のサプライヤーからの製品のみを持つ注文を取り出すことです。あなたが私に見せてくれたこのクエリは、指定されたサプライヤからのプロダクトを持つすべてのオーダーを取り出しますが、それらのサプライヤだけではありません。 – Bazze

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)

+0

残念ながら、これはトリックを行いません。注文は、異なるサプライヤーの製品をたくさん持つことができます。私が望むのは、1つまたは複数の特定のサプライヤーからの製品のみを持つ注文を取り出すことです。あなたが私に見せてくれたこのクエリは、指定されたサプライヤからのプロダクトを持つすべてのオーダーを取り出しますが、それらのサプライヤだけではありません。 – Bazze