LEFT / RIGHT JOIN不返回空行

时间:2011-12-05 16:12:00

标签: mysql join

我有一个查询,它使用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中的对象返回两次。现在全部排序 - 谢谢!

2 个答案:

答案 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中执行此操作将仅对要连接的特定记录执行过滤。