LEFT JOIN ManyToMany多个参数

时间:2016-11-26 17:47:00

标签: mysql sql

我在使用MYSQL查询时遇到了一些问题。我正在尝试使用多个参数进行LEFT JOIN

数据库结构:

士兵可以有多个标签,这些标签分配给具有ManyToMany关系的士兵

我的查询用于搜索功能,用户可以在其中添加他/她想要查找的一些标签。到目前为止,可以使用一个标签进行搜索,但是一旦添加了多个标签,查询就不会返回结果,即使它应该。

使用的查询:

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;

有没有人知道如何解决这个问题?

提前致谢

4 个答案:

答案 0 :(得分:1)

你会想要使用' IN'接下来是参数,如下所示,这将在执行查询时考虑这两个参数。

System.out.println(Introspector.decapitalize("RPersonId")); // prints RPersonId System.out.println(Introspector.decapitalize("PersonAddress")); // prints personAddress

答案 1 :(得分:0)

当连接条件与一组值相关时(例如标签列表)您应该使用in子句

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

答案 2 :(得分: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子句中。

答案 3 :(得分:0)

您应该在fs.readdirAsync()子句中使用OR运算符:

WHERE

如果查询中可能包含2个以上的代码,最好使用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 运算符作为@scaisEdge提及