首页 > 解决方案 > 同一个表在 2 个条件下内连接一个表,并且任何一个条件有时都是错误的

问题描述

在此处输入图像描述

细节:

  1. V并且C是表格

  2. 我想C加入V2 个条件(两个 C 被命名为C0C1)。由于我必须在同一查询中分别按和的子表V的列进行过滤,因此我认为需要加入。CC

  3. 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%': 这个子句要看时间。

标签: mysqlsql

解决方案


好吧...您似乎正在寻找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 EXISTSWHERE NOT EXISTS.


推荐阅读