Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL查询-多连接_Mysql_Sql_Join - Fatal编程技术网

MySQL查询-多连接

MySQL查询-多连接,mysql,sql,join,Mysql,Sql,Join,我有一个表t1,它充满了由键标识的运算符的度量,我将其称为PID,我试图从另一个表t3中检索一个状态列,t3通过不同类型的键标识运算符,我将其称为SID。问题是需要一个额外的表t2来将SID映射到PID 我需要检索t3中的所有信息,如果t1中的运算符没有可用数据,则返回null 这些表格的结构如下: Table 1 ---------------------------- | PID | ... | ... | Date | ---------------------------- | 1

我有一个表t1,它充满了由键标识的运算符的度量,我将其称为PID,我试图从另一个表t3中检索一个状态列,t3通过不同类型的键标识运算符,我将其称为SID。问题是需要一个额外的表t2来将SID映射到PID

我需要检索t3中的所有信息,如果t1中的运算符没有可用数据,则返回null

这些表格的结构如下:

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,从而删除行。