mysql - 同一个表在 2 个条件下内连接一个表,并且任何一个条件有时都是错误的
问题描述
细节:
V
并且C
是表格我想
C
加入V
2 个条件(两个 C 被命名为C0
和C1
)。由于我必须在同一查询中分别按和的子表V
的列进行过滤,因此我认为需要加入。C
C
V
有很多,至少一个C
,而且Cx
有时都不存在。
由于 3.,使用内部连接C0
有时C1
会导致空结果,但我不想得到V
白色区域。
架构:
V (id)
C (id, v_id, name, type)
查询(1):
SELECT V.*
FROM V
INNER JOIN C AS C0 ON V.id = C0.v_id WHERE C0.type = 0
INNER JOIN C AS C1 ON V.id = C1.v_id WHERE C1.type = 1
WHERE C0.name = 'word' or C1.name = 'word'
WHERE C0.name like '%wo%'
查询(2):
SELECT V.*
FROM V
INNER JOIN C AS C0 ON V.id = C0.v_id WHERE C0.type = 0
INNER JOIN C AS C1 ON V.id = C1.v_id WHERE C1.type = 1
WHERE C0.name = 'word' or C1.name = 'word'
WHERE C1.name like '%wo%'
WHERE C0.name = 'word' or C1.name = 'word'
: 这个子句每次都存在。
WHERE Cx.name like '%wo%'
: 这个子句要看时间。
解决方案
好吧...您似乎正在寻找EXISTS
具有相关子查询的条件:
SELECT * FROM v
WHERE EXISTS (SELECT 1 FROM c WHERE c.c0 = v.c0 OR c.c1 = v.c1)
这将返回表v
中至少存在一条c
满足条件c.c0 = v.c0
或条件 的记录的所有记录c.c1 = v.c1
。
在这种情况下,相关子查询相对于该JOIN
方法的优势在于,当 table 中存在多个匹配项时,它可以避免记录相乘c
。
如果您想排除满足任一条件的记录而不是包括它们,则只需更改WHERE EXISTS
为WHERE NOT EXISTS
.
推荐阅读
- flutter - 如何让 Stack 的一个元素出现在另一个元素之外?
- string - Dart 解析字符串包含地图列表
- reactjs - 尝试在 React-table 中覆盖分页但不起作用
- javascript - 布尔类型不能分配给过滤功能中的类型“团队”
- cocoa - Cocoapods 项目无法在 Apple Silicon / M1 Mac 上构建
- javascript - 加载模块脚本失败:服务器以“text/x-scss”的非 JavaScript、CSS MIME 类型响应
- python - 使用 Numpy 在 Python 中进行混淆矩阵练习
- ios - 接收音乐文件到应用程序 - 需要在 Airdrop 菜单中显示我的应用程序才能接收文件
- c# - 来自浏览器的 C# AWS Lambda API Gateway - 参数不起作用
- go - golang 使用 bufio.NewScanner 读取大量数据