LEFT JOIN ManyToMany多个参数
问题描述:
我有一些MYSQL查询问题。我正在尝试使用多个参数执行LEFT JOIN
。LEFT 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;
有没有人有一个想法,我可以解决这个问题?提前
答
当连接条件是有关一组值
感谢(如标签的列表),如果你希望所有的标签相匹配,您应该在第
SELECT *
FROM soldiers s
LEFT JOIN soldier_tag st ON s.id=st.soldier_id
WHERE st.tag_id in ( 5 , 7)
答
使用,我建议措辞作为查询是这样的:
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
子句中。
答
你应该在你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提到
答
你会想IN
运营商要使用后面跟随参数的'IN',这将在查询执行时考虑这两个参数。
SELECT * FROM soldiers s LEFT JOIN soldier_tag st ON s.id = st.soldier_id WHERE st.tag_id IN (5,7);
当用户输入多个标签时,您想要什么逻辑?你想*任何*标签匹配或*所有*标签匹配? –
所有标签都应该匹配,例如如果用户输入2个标签,士兵应该有tag1和tag2匹配 – kwinne