2016-08-08 11 views
1

私はいくつかの結合クエリを連鎖させる必要があり、私が望む結果を得ることができません。
いくつかの製品情報を保存するテーブルが多数あります。mysqlのINNERとLEFT JOIN

- 製品:多くの言語での名前と説明です。

-Products_attributes:プロバイダのような製品の一般的な属性または購入価格。

-Products_locations:在庫や販売価格などの特定の製品を販売する場所に関する情報。

その他の重要なテーブルは、企業の1つです。これらの企業の一部はプロバイダになる可能性があります。

まあ、これは私のクエリです:私は何をしたいか

SELECT p.id 
    , p.name nameProduct 
    , p.reference refProduct 
    , a.buy_price priceProduct 
    , l.active 
    , l.sell_price 
    , l.stock stockProduct 
    , c.title p_name 
    FROM products p 
    LEFT JOIN products_location l 
    ON l.product_reference = p.reference 
    AND l.active = 1 
    AND l.location_id = 4 
    JOIN products_attributes a 
    ON a.product_reference = p.reference 
    AND p.lang = 'es' 
    AND a.provider = 6 
    JOIN companies c 
    ON a.provider = c.id 
    AND c.id = 6 

は、クエリを実行している場所から場所が、この製品は、結果の行を持っている場合、特定のプロバイダのすべての製品を取得することですこの製品に関連する情報を返さなければなりません< - >逆に、この関係に関連する列にNULLを返す必要があります。
現在のところ、このクエリでは、私が得ているすべてのものは、製品< - >場所(products_locationテーブルを通じて)の間に関係があるプロバイダの製品です。

これを行う方法はありますか?

ありがとうございます。

TABLE::会社

id | Title 
1 | SomeName 
6 | ProviderName 

TABLE:製品

id | reference | name | lang 
1 | 11111  | 1_es | es 
2 | 11111  | 1_en | en 
3 | 22222  | 2nam | es 
4 | 33333  | 3nam | es 
5 | 44444  | 4nam | es 
6 | 55555  | 5nam | es 

TABLE私が取得しようとしているものについて

EDIT

の例では、このようなものかもしれません:Products_atributte

id | product_reference | buy_price | provider 
1 | 11111    | 10  | 6 
1 | 22222    | 15  | 6 
1 | 33333    | 20  | 6 
1 | 44444    | 12  | 1 
1 | 55555    | 13  | 1 

TABLE:Products_locations

id | product_reference | location_id | sell_price | stock | active 
1 | 11111    | 4   | 26   | 10 | 1 
1 | 11111    | 5   | 25   | 13 | 1 
1 | 22222    | 5   | 20   | 13 | 1 
1 | 44444    | 5   | 21   | 1 | 1 
1 | 55555    | 5   | 22   | 2 | 1 

、結果はこのようなものでなければなりません。私はLEFTを使用する場合は

nameProduct | refProduct | priceProduct | active | sell_price | stockProduct | p_name 
1_es  | 11111  | 10   | 1  | 26   | 10   | ProviderName 
2nam  | 22222  | 15   | NULL | NULL  | NULL   | ProviderName 
3nam  | 33333  | 20   | NULL | NULL  | NULL   | ProviderName 

がproducts_locationsテーブルにのみ登録しよう、私はドントGET最後の2行、LEFT JOINをすべてのテーブルで使用すると、重複した製品リファレンスが得られます。また、他のプロバイダ(例1-> SomeName)が提供する製品を取得します。

+0

質問は不明です。あなたが得たいものと結果として得ているものの例を見直して、例を挙げてみてください。 – evilpenguin

+0

私たちに戦闘の機会を与えるために、私は質問を再フォーマットし、それを少しきれいにしました。 – Strawberry

+0

'それをする方法は何ですか?'あなたのタイトルであなたが言ったことはどうですか? 'JOIN'を' LEFT JOIN'に変更してください。 'INNER'がデフォルトであり、他のテーブルで一致しない' NULL'sを持つ行を返さないためです。 –

答えて

1

LEFT JOINproductsテーブルとproducts_locationテーブルに間違いはありませんでした。しかし、クエリ内の他の2つのテーブルにはINNER JOINを使用しました。これは、製品と場所の間に関連性を持つレコードのみを表示する理由と考えられます。論理は、ロケーションがない製品でもは、例えばproducts_attributesテーブルにエントリを持たないことになります。したがって、保持したい一致しないレコードは、INNER JOINによって下流にフィルタリングされます。これを解決するには、LEFT JOINをどこでも使用してください:

SELECT products.id, 
     products.name AS nameProduct, 
     products.reference AS refProduct, 
     products_attributesbuy_price AS priceProduct, 
     products_location.active, 
     products_location.sell_price, 
     products_location.stock AS stockProduct, 
     provider.title AS p_name 
FROM products 
LEFT JOIN products_location 
    ON products_location.product_reference = products.reference AND 
     products_location.active = 1 AND 
     products_location.location_id = 4 
LEFT JOIN products_attributes 
    ON products_attributes.product_reference = products.reference AND 
     products.lang = 'es' AND 
     products_attributes.provider = 6 
LEFT JOIN companies AS provider 
    ON products_attributes.provider = provider.id AND 
     provider.id = 6 
+0

こんにちは@TimBiegeleisenすべてのテーブルでLEFT JOINを使用すると問題が発生します...私は重複した結果を得て、私が求めている提供によって提供されていない製品も手に入れます。ありがとうございました。 –