我有一些LEFT JOIN的查询。我试图让其中一个在一个子句不匹配时显示NULL匹配。
SELECT *, sr.id as role_id, ss.id as scheduled_entry_id
FROM T_STAFF_ROLE AS sr
LEFT JOIN T_STAFF_SCHEDULE AS ss
ON sr.id = ss.staff_role_id
LEFT JOIN T_BOOKINGS_ADMIN AS ba
ON ba.id = ss.admin_user_id
AND ss.client_booking_id='12495' // unreal id
ORDER BY sr.id
我希望始终显示T_STAFF_ROLE
个条目
如果此处有匹配项ss.client_booking_id=".$id_booking.'
显示,则返回包含NULL
值的字段。
我尝试使用AND
(就像现在一样),但随后我也会使用其他ss.client_booking_id
获得所有结果。
尝试WHERE
,但如果没有匹配,我就什么也得不到。我想在sr
上每行仍然有一个条目。我认为那是“LEFT”JOIN的重点
我的逻辑或代码在哪里错了?
我呈现的查询:
SELECT *, sr.id as role_id, ss.id as scheduled_entry_id
FROM staff_role AS sr
LEFT JOIN staff_schedule AS ss ON sr.id = ss.staff_role_id
LEFT JOIN admin_users AS ba ON ba.id = ss.admin_user_id
AND ss.client_booking_id=336 ORDER BY sr.id
我的sr
有9行,已修复。不同的角色,如出租车,清洁工,导游。 ss
是某个角色/人的预订。我在PHP上使用此查询来生成HTML,并希望它为所有“角色”生成数据,以防其中一些不匹配。
答案 0 :(得分:1)
条件AND ss.client_booking_id=".$id_booking.'
位于错误的位置。它应该是T_STAFF_SCHEDULE
加入的一部分。在当前查询中,您获得与sr.id匹配的所有T_STAFF_SCHEDULE,以及当其父T_BOOKINGS_ADMIN
的任何匹配T_STAFF_SCHEDULE
时的所有$id_booking
。
好吧,我不知道每个列和表的含义,但我认为它应该是这样的:
"SELECT *, sr.id as role_id, ss.id as scheduled_entry_id
FROM ".T_STAFF_ROLE." AS sr
LEFT JOIN ".T_STAFF_SCHEDULE." AS ss
ON sr.id = ss.staff_role_id
AND ss.client_booking_id=".$id_booking."
LEFT JOIN ".T_BOOKINGS_ADMIN." AS ba
ON ba.id = ss.admin_user_id
ORDER BY sr.id";