首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LEFT JOIN ManyToMany多个参数

LEFT JOIN ManyToMany多个参数
EN

Stack Overflow用户
提问于 2016-11-27 01:47:00
回答 4查看 52关注 0票数 0

我对MYSQL查询有一些问题。我正在尝试做一个有多个参数的LEFT JOIN

数据库结构:

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

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

使用的查询:

代码语言:javascript
运行
复制
SELECT *
FROM soldiers s LEFT JOIN
     soldier_tag st
     ON s.id = st.soldier_id
WHERE st.tag_id = 5;

当用户输入2个标签时,两个标签都应该算术。查询将变成这样:

代码语言:javascript
运行
复制
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;

有谁知道我怎么解决这个问题吗?

提前感谢

EN

回答 4

Stack Overflow用户

发布于 2016-11-27 04:05:30

您将希望在参数后面使用'IN‘,如下所示,这将在执行查询时考虑这两个参数。

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

票数 1
EN

Stack Overflow用户

发布于 2016-11-27 01:48:23

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

代码语言:javascript
运行
复制
 SELECT * 
 FROM soldiers s 
 LEFT JOIN soldier_tag st ON s.id=st.soldier_id 
 WHERE st.tag_id in (  5 , 7)
票数 0
EN

Stack Overflow用户

发布于 2016-11-27 01:53:10

如果您希望所有标签都匹配,我建议您将查询表述为如下所示:

代码语言:javascript
运行
复制
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。您需要将列表放在IN中,将计数放在HAVING子句中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40821239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档