2013-06-13 18 views
5

MySQLデータベースにサプライヤディレクトリテーブルがあり、それにはサプライヤマッピングテーブルが関連付けられています。この表は、個々のサプライヤに対して以下の基準をマップします。MySQLはENUM値に基づいて選択します

  1. サービス。
  2. スペシャリティ
  3. 規格

ちょうど背景情報のためにこれらのそれぞれは、3つの個別対応のテーブルに格納された値を持っています。任意のサプライヤによって提供されることができるすべてのサービスはサービステーブルにリストされ、マッピングテーブルは個々のサプライヤによって提供されるサービスをキャプチャする。サプライヤは複数のサービスを提供することができるため、提供するサービスごとにマッピングを持つことができます。専門店や規格にも同じです。

私が問題に遭遇しているのは、ユーザーが上記の基準のいずれか1つまたは3つすべてでサプライヤーのリストを照会できる検索照会です。たとえば、サービスa、専門b、標準cのサプライヤを検索することができます。彼らは、サービス、専門に複数の値を検索したりすることはできません標準

マイマッピングテーブルには、次のようになりますENTITY_TYPEマップはエンティティタイプを示すために使用される

id int(11) unsigned NOT NULL 
supplier_id int(11) unsigned NOT NULL 
entity_type enum('KEY_SERVICE','STANDARD','SPECIALITY') NOT NULL 
entity_id int(11) NOT NULL 

がマッピングされているとENTITY_IDが示します個々のエンティティ。次のように

私のクエリは次のとおりです。

SELECT DISTINCT supplier_mappings.supplier_id, suppliers.company_name 
FROM supplier_mappings 
JOIN suppliers ON suppliers.id = supplier_mappings.supplier_id 
WHERE (supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') 
AND (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218') 
AND (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 
ID 55、ID 218を持つ専門性とただし、ID 15と標準それだけで戻ってキーサービスを持っているすべてのサプライヤーを返す必要があります

これらが定義された少なくとも1つのサプライヤがあることはわかっていますが、空の結果セットがあります。それは複合AND節と関係があると思われますが、何が分かりません。

他にもアイデアがありますか?

+0

あなたのテーブルでいくつかのサンプルデータを作成し、それをSQL Fiddleに入れることができますか? – Kermit

+0

http://sqlfiddle.com/#!2/bddae/2を参照してください。以前はSQL Fiddleを使用していなかったようにうれしいです。 キーサービス= 1、専門= 1、標準= 3のサプライヤを検索すると、サプライヤ1とサプライヤ4が返されます。 –

答えて

3

あなたは、クエリの条件を見てみる場合:

(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') AND(supplier_mappings.entity_type = 'SPECIALTY' AND supplier_mappings.entity_id =例えば、 '218') AND(supplier_mappings.entity_type = '標準' AND supplier_mappings.entity_id = '15')

: supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_typeは= 'SPECIALTY' は常に返されFALSE値。

この

SELECT DISTINCT suppliers.ID, suppliers.company_name 
      FROM suppliers, 
       supplier_mappings mapA, 
       supplier_mappings mapB, 
       supplier_mappings mapC 
      WHERE suppliers.ID = mapA.supplier_id 
      AND suppliers.ID = mapB.supplier_id 
      AND suppliers.ID = mapC.supplier_id 
      AND mapA.entity_type = 'KEY_SERVICE' AND mapA.entity_id = '55' 
      AND mapB.entity_type = 'SPECIALITY' AND mapB.entity_id = '218' 
      AND mapC.entity_type = 'STANDARD'  AND mapC.entity_id = '15'; 
+0

ビンゴ。それがチケットです。乾杯。 –

1

のようなあなたのブール論理を見てみましょうあなたは、別のテーブルのforeachの条件を使用する必要があります。最後に、あなたは、連想機能を持っている( "AND")

ので、この

(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') 
AND (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218') 
AND (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 

supplier_mappings.entity_type = 'SPECIALITY' 

supplier_mappings.entity_type = 'KEY_SERVICE' 

の両方を持っている何かのためにtrueを返します同時に何かがこのようなことができる方法はありません。 (これは第3の値についても真であり、idは途中で)。あなたは一度にこれらのすべてを望んでいません。 例はsimpelerの場合です。id=3の行との行の両方を単純な表から作成する場合は、両方の行を持たない行がないため、論理はWHERE id=3 AND id=4になりません。代わりに、あなたはこれらの個別のケースについてORをしたい、(私はこれは完全にすべてのものを固定しているわからないんだけど、それはあなたが軌道に乗る必要があります)の代わりにWHERE id=3 OR id=4

をお願いしたい:

(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') 
OR (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218') 
OR (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 
+0

ORを使用すると動作しますが、条件が一致した場合に結果セットが返されることを意味します。すべての条件が一致することを確認する必要があります。 –

+0

は不可能ですが、一度に2つのことをすることはできません – Nanne

関連する問題