MySQL查询-多连接
我有一个表t1,它充满了由键标识的运算符的度量,我将其称为PID,我试图从另一个表t3中检索一个状态列,t3通过不同类型的键标识运算符,我将其称为SID。问题是需要一个额外的表t2来将SID映射到PID 我需要检索t3中的所有信息,如果t1中的运算符没有可用数据,则返回null 这些表格的结构如下:MySQL查询-多连接,mysql,sql,join,Mysql,Sql,Join,我有一个表t1,它充满了由键标识的运算符的度量,我将其称为PID,我试图从另一个表t3中检索一个状态列,t3通过不同类型的键标识运算符,我将其称为SID。问题是需要一个额外的表t2来将SID映射到PID 我需要检索t3中的所有信息,如果t1中的运算符没有可用数据,则返回null 这些表格的结构如下: Table 1 ---------------------------- | PID | ... | ... | Date | ---------------------------- | 1
Table 1
----------------------------
| PID | ... | ... | Date |
----------------------------
| 1 | ... | ... | 9/09/19|
----------------------------
| 1 | ... | ... | 9/10/19|
----------------------------
| 2 | ... | ... | 9/09/19|
----------------------------
| 2 | ... | ... | 9/10/19|
----------------------------
Table 2
-----------------
| SID | PID |
-----------------
| 01 | 1 |
-----------------
| 02 | 1 |
-----------------
| 10 | 2 |
-----------------
| 11 | 2 |
-----------------
Table 3
----------------------------
| SID | Status | Date |
----------------------------
| 01 | P | 9/09/19 |
----------------------------
| 02 | P | 9/10/19 |
----------------------------
我尝试了一些查询,从我所读到的内容来看,我需要做一个左连接,因为我需要保留第一个表中的所有内容,如果没有行与第一个表匹配,则返回null。我不确定的一件事是,由于可以将多个SID连接到一个PID,因此我不确定查询的行为。如果所有SID状态都属于相同的PID,那么它们应该是一致的,那么它是否只返回第一个匹配
我当前的查询:
选择t1.*,t3.状态
从表1 t1中,
左连接表2 t2
在t1.PID=t2.PID上
左连接表3 t3
在t2.SID=t3.SID和t1.Date=t3.Date上
按t1.PID、t1.Date排序
到目前为止,最接近我想要的是上面的查询。我试图修改它的一些部分,但问题是它似乎遗漏了任何没有关联状态的PID
我希望看到类似以下的情况:
--------------------------------------
| PID | ... | ... | Date | Status |
--------------------------------------
| 1 | ... | ... | 9/09/19| P |
--------------------------------------
| 1 | ... | ... | 9/10/19| P |
--------------------------------------
| 2 | ... | ... | 9/09/19| null |
--------------------------------------
| 2 | ... | ... | 9/10/19| null |
--------------------------------------
然而,我得到的结果是省去了PID为2的行。感谢您的帮助 增加了一个我忽略的WHERE子句。感谢@Eric的帮助指出了这一点。您的查询看起来不错,除了这里有一个拖尾逗号:
来自Table1 t1,
,但这看起来更像是一个打字错误(否则会出现语法错误),结果中应该会显示带有PID 2
的记录,使用NULL
状态,如预期。我使用PID 2获得结果:除了第2行末尾的逗号之外,我没有看到任何错误。你确定没有WHERE
子句吗?@Eric谢谢!添加了一个WHERE子句(t3.Status!=“X”)来删除不需要的状态,我假设它会删除null。我忘了在上面添加它,但确实是这样。是的,这将删除空值,因为如果一个操作数为空,大多数运算符的计算结果都为空。计算为null的where子句被视为计算为false,从而删除行。