Php MySQL:当一个表上存在多个联接时,考虑空值或0值
我有一个查询,它根据记录ID在名为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
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确实驱动查询。我打错了表名。现在修好了。