私はいくつかの結合クエリを連鎖させる必要があり、私が望む結果を得ることができません。
いくつかの製品情報を保存するテーブルが多数あります。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)が提供する製品を取得します。
質問は不明です。あなたが得たいものと結果として得ているものの例を見直して、例を挙げてみてください。 – evilpenguin
私たちに戦闘の機会を与えるために、私は質問を再フォーマットし、それを少しきれいにしました。 – Strawberry
'それをする方法は何ですか?'あなたのタイトルであなたが言ったことはどうですか? 'JOIN'を' LEFT JOIN'に変更してください。 'INNER'がデフォルトであり、他のテーブルで一致しない' NULL'sを持つ行を返さないためです。 –