我有一个查询,它使用2个表上的自联接来返回单行结果。我遇到的问题是,如果seat1为空,我不会得到任何返回。
SELECT seat1.seat_type_id
, seat1.seat_type_qty
, seat2.seat_type_id
, seat2.seat_type_qty
FROM jos_sv_apptpro2_requests AS R
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat1 ON R.id_requests = seat1.request_id
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat2 ON R.id_requests = seat2.request_id
WHERE (seat1.seat_type_id = 6 AND seat2.seat_type_id = 7)
AND R.id_requests = 8703
AND R.resource = 3
这应该返回:
seat_type_id 6
seat_type_qty 0 <= this is the empty row
seat_type_id1 7
seat_type_qty 1
编辑: 我现在有了:
SELECT
IFNULL(seat1.seat_type_qty,0) AS seat_type_qty,
IFNULL(seat2.seat_type_qty,0) AS seat_type_qty
FROM jos_sv_apptpro2_requests AS R
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat1
ON R.id_requests = seat1.request_id AND seat1.seat_type_id = 6
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat2
ON R.id_requests = seat2.request_id AND seat2.seat_type_id = 7
WHERE R.id_requests = 8696
重新编辑! - 我的错误,我将seat_type_qty作为PHP中的对象返回两次。现在全部排序 - 谢谢!
答案 0 :(得分:3)
WHERE seat1.seat_type_id = 6 AND seat2.seat_type_id = 7
是删除所有具有NULL值的行。您应该将这些条件移动到JOIN条件,以便RDBMS执行您期望的操作:
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat1 ON R.id_requests = seat1.request_id
AND seat1.seat_type_id = 6
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat2 ON R.id_requests = seat2.request_id
AND seat2.seat_type_id = 7
答案 1 :(得分:1)
将where子句移动到JOIN中:
LEFT JOIN jos_sv_apptpro2_seat_counts AS seat1
ON (R.id_requests = seat1.request_id) AND (seat1.seat_type_id = 6)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
当你在where子句中使用它们时,你将匹配整行。在JOIN中执行此操作将仅对要连接的特定记录执行过滤。