2011-11-07 12 views
0

私は3つのテーブルをリンクするmysqlクエリをまとめようとしています。本質的には、表は以下の通りです。MYSQL - joinクエリで少し混乱する/

  1. - 製品に関する情報と基本的な価格が含まれています。
  2. product_depts - 製品を異なる部門にリンクするリンクテーブル。
  3. プロモーション - 別のリンクテーブル、プロモーション期間と商品IDに基づく価格をリンクします。

これは、クエリで次の行が削除された場合

SELECT p.id, `desc` , price1, price2, cost1, taxable, quantity, deptId, sale 
FROM products p 
INNER JOIN product_depts ON p.id = prodId 
INNER JOIN promotions s ON p.id = s.id 
WHERE MATCH (
`desc` 
) 
AGAINST (
'CLOVER' 
IN BOOLEAN 
MODE 
) 
ORDER BY `desc` 
LIMIT 0 , 30 

INNER JOIN promotions s ON p.id = s.id 

そしてselect句から取り出しsale

何が起こる、ALLです商品表に「CLOVER」を含む説明を含む商品が戻されます。

削除されたクエリ部分が追加されると、プロモーション中のアイテム(プロモーションテーブルに一致するIDを持つアイテム)のみが返されます。 productsテーブルに「CLOVER」を含む、「プロモーション中」ではない追加の商品は除外されます。

私はmysqlに関して非常に限られた知識しか持っていないので、私はこの問題について多くの知識を持っている人だと思っていました。

私はそれを理解しているので、これは完全に動作するproduct_deptsテーブルからdeptIdを呼び出すのと本質的に同じものになります。それは私を混乱させています。

"プロモーション中"のアイテムだけが表示され、追加の結果が表示されないのは間違っていますか?

ありがとうございました!

+2

代わりに「LEFT JOIN」を使用してください。 – diEcho

答えて

2

INNER結合は、基本的に "BOTHテーブルに一致するレコードがあるすべてのレコードを取得する"と言います。

質問を正しく読んでいる場合は、「1つのテーブルからすべてのレコードを取り出す」と「他のテーブルから一致するレコードがあれば(もしあれば)あなたはすべての製品を取得したいよう。

彼らはプロモーションやないを持っていますが、彼らは昇進を持っている場合は、同様のプロモーション情報を取得するかどうか、ですね。

SELECT ... 
FROM products 
INNER JOIN product_depts ON ... 
LEFT JOIN promotions ON ... 
なるだろうと

だから、すべての製品には部門が必要なので、インをしてくださいクエリーの特定の部分についての結合を行います。プロモーションの左結合により、 'products'テーブルがLEFTテーブルになり、そのテーブルのすべてのレコードがフェッチされます。プロモーション・テーブルはRIGHTテーブルになり、プロモーション・テーブルに一致するレコードがある場合にのみクエリ結果のデータを提供します。

So ...そのうちの1つが販売されている2つの製品がある場合、結果は

product #1 department #1 promoinfo #1 
    product #2 department #2 NULL 

となります。 #2製品には一致するプロモーション情報がないため、プロモーションデータにはNULLが返されます。

+0

正確に点を当てて問題を解決しました!あなたはいつも私の問題からミースミットを作ります、ありがとう!! –

+0

2回投票してもらえれば、本当に助かりました。もう一度ありがとう! –