2016-11-26 184 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);