2016-11-26 6 views
0

MYSQLクエリにいくつか問題があります。私は複数のパラメータでLEFT JOINをやろうとしています。LEFT JOIN ManyToMany複数のパラメータ

DB構造:

兵士が複数のタグを持つことができ、これらのタグは、多対多の関係

で兵士に割り当てられている私のクエリは、ユーザーが追加することができ、検索機能で使用されています彼/彼女が探しているいくつかのタグ。これまでのところ、1つのタグで検索することは可能でしたが、複数のタグを追加するとすぐに、クエリは結果を返しません。

使用クエリ:

SELECT * 
FROM soldiers s LEFT JOIN 
    soldier_tag st 
    ON s.id = st.soldier_id 
WHERE st.tag_id = 5; 

ユーザーが2個のタグを入力すると、その後、両方のタグが数学する必要があります。クエリは次のようになります。

SELECT * 
FROM soldiers s LEFT JOIN 
    soldier_tag st 
    ON s.id = st.soldier_id 
WHERE st.tag_id = 5 AND st.tag_id = 7; 

この問題をどのように修正できるのでしょうか?事前

+0

ユーザーが複数のタグを入力したときにどのようなロジックが必要ですか? * any *タグが一致するか、* all *タグが一致するようにしますか? –

+0

すべてのタグが一致する必要があります。たとえば、ユーザーが2つのタグを入力した場合、兵士は一致させるにはtag1とtag2が必要です。 – kwinne

答えて

0

おかげ結合条件(例えば、タグのリスト)値のセットに関連しているあなたはすべてのタグが一致する場合は、句

SELECT * 
FROM soldiers s 
LEFT JOIN soldier_tag st ON s.id=st.soldier_id 
WHERE st.tag_id in ( 5 , 7) 
0

に使用する必要があり、

SELECT s.* 
FROM soldiers s 
WHERE s.id IN (SELECT st.soldier_id 
       FROM solder_tag st 
       WHERE st.tag_id IN (5, 7) -- construct an `IN` list instead of a bunch of boolean expressions 
       GROUP BY st.soldier_id 
       HAVING COUNT(*) = 2  -- 2 is the number of tags 
      ); 

サブクエリは、すべてのタグが一致soldier_id秒を返します。私はこのようなものとして、クエリをフレージングを示唆しています。リストをINに、そして数をHAVINGに入れる必要があります。

あなたの WHERE句で OR演算子を使用する必要があります
0

:それは、クエリで2個の以上のタグを持つことが可能なら、それは@scaisEdgeが

1

は、あなたが望むだろうに述べたようにIN演算子を使用することをお勧めします

SELECT * 
FROM soldiers s 
LEFT JOIN soldier_tag st ON s.id=st.soldier_id 
WHERE st.tag_id=5 OR st.tag_id=7 

'IN'とそれに続くパラメータを使用するには、クエリ実行時に両方のパラメータを考慮します。

SELECT * FROM soldiers s LEFT JOIN soldier_tag st ON s.id = st.soldier_id WHERE st.tag_id IN (5,7);