Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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
Php MySQL:当一个表上存在多个联接时,考虑空值或0值_Php_Mysql_Sql - Fatal编程技术网

Php MySQL:当一个表上存在多个联接时,考虑空值或0值

Php MySQL:当一个表上存在多个联接时,考虑空值或0值,php,mysql,sql,Php,Mysql,Sql,我有一个查询,它根据记录ID在名为users的表中查找人们的全名。全名与另一个表(table1)中的角色关联。这需要对用户表进行多个联接: SELECT table1.id, users.full_name AS "Requester", users.full_name AS "Approver," users.full_name AS "Ordered By", users.full_name AS "Received By" FROM table1 JOIN users AS use

我有一个查询,它根据记录ID在名为
users
的表中查找人们的全名。全名与另一个表(
table1
)中的角色关联。这需要对
用户
表进行多个联接:

SELECT table1.id, users.full_name AS "Requester", 
users.full_name AS "Approver," 
users.full_name AS "Ordered By", 
users.full_name AS "Received By" 
FROM table1
JOIN users AS users
ON table1.requester_id = users.id
JOIN users AS users2
ON table1.approver_id = users2.id
JOIN users AS users3 
ON table1.ordered_by = users3.id
JOIN users AS users4
ON table1.received_by = users4.id
WHERE table1.deleted_record !=1;

我遇到的问题是由订购的
和由
接收的
。通常,它们还不存在,因为订单既没有订购也没有收到,因此每个订单的ID可以是0,在
用户
表中没有相应的值。当我运行此查询时,我应该返回所有存在的475条记录,但我只返回365条,因为这是0个值。我如何修改此查询以确保返回所有行,即使
ordered\u by
和/或
received\u by
=0?

您正在寻找
左联接

SELECT t1.id, ur.full_name AS "Requester", 
       ua.full_name AS "Approver," 
       uo.full_name AS "Ordered By", 
       urv.uo AS "Received By" 
FROM table1 t1 LEFT JOIN
     users ur
     ON t1.requester_id = ur.id LEFT JOIN
     users ua
     ON t1.approver_id = ua.id LEFT JOIN
     users uo 
     ON t1.ordered_by = uo.id LEFT JOIN
     users urv
     ON t1.received_by = urv.id
WHERE t1.deleted_record <> 1;
选择t1.id,ur.full\u名称作为“请求者”,
ua.U全名为“批准人”
uo.全名为“订购人”,
urv.uo作为“接收人”
从表1到t1左连接
用户ur
在t1.requester_id=ur.id左连接上
用户ua
在t1.approver_id=ua.id左加入
用户uo
在t1.ordered_by=uo.id上左连接
用户urv
在t1.u上,接收者=urv.id
其中t1.u记录1;

请注意,我将
用户
引用上的别名从毫无意义的
u1
u2
等更改为
ua
uo
,依此类推。此外,需要在
选择
中使用这些表来获得正确的全名。

首先,驱动查询的主表应该是
表1
。然后,您使用的是
JOIN
而不是
LEFT JOIN
<如果没有链接,code>LEFT JOIN
将为您提供一个空结果,但不会失败。在这种情况下,您可能必须为字段值使用
IF

SELECT table1.id, req.full_name AS "Requester", 
   app.full_name AS "Approver", 
   ordr.full_name AS "Ordered By", 
   rec.full_name AS "Received By" 
FROM table1
LEFT JOIN users AS req
   ON table1.requester_id = req.id
LEFT JOIN users AS app
   ON table1.approver_id = app.id
LEFT JOIN users AS ordr
   ON table1.ordered_by = ordr.id
LEFT JOIN users AS rec
   ON table1.received_by = rec.id
WHERE table1.deleted_record !=1;

这应该可以了

谢谢。我从内部连接开始,当我没有得到想要的结果时,我就放弃了这些连接。LEFT JOIN修复了它。table1确实驱动查询。我打错了表名。现在修好了。