我在使用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;
有没有人知道如何解决这个问题?
提前致谢
答案 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提及