2016-11-26 88 views
0

我有一些MYSQL查詢問題。我正在嘗試使用多個參數執行LEFT JOINLEFT JOIN ManyToMany多個參數

DB結構:

一個士兵可以有多個標籤,這些標籤被分配給士兵用多對多關係

我的查詢是在用戶能夠添加搜索功能使用他/她想要尋找的一些標籤。到目前爲止,可以使用一個標籤進行搜索,但只要添加了多個標籤,查詢即使應該也不會返回結果。使用

查詢:

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

當用戶輸入多個標籤時,您想要什麼邏輯?你想*任何*標籤匹配或*所有*標籤匹配? –

+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 S其中所有的標籤匹配。您需要將列表放入IN,並將計數放在HAVING子句中。

0

你應該在你WHERE子句中使用OR操作:

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 

如果有可能在查詢超過2個標籤,它更好地使用如@scaisEdge提到

1

你會想IN運營商要使用後面跟隨參數的'IN',這將在查詢執行時考慮這兩個參數。

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