2010-09-11 149 views
0

我有两张桌子,一张预留一个房间,另一张是“中间”桌子,用于保存预订房间的日期(因为预订可能有多个非连续的日期)。mysql左连接问题

它看起来是这样的:

Res_table: ID,ROOM_ID,owner_id

Res_table_mid: ID,RES_ID,日期

在res_table_mid的RES_ID列引用res_table的ID。我需要获取预订的开始和结束日期。

所以查询看起来是这样的:

SELECT * FROM res_table a 
LEFT JOIN (SELECT min(date) as start_date, res_id FROM res_table_mid) AS min ON a.id = min.res_id 
LEFT JOIN (SELECT max(date) as end_date, res_id FROM res_table_mid) AS max ON a.id = max.res_id 

可正常工作,除非该表是空的或没有结果,在这种情况下,它有错误

#1048 - Column 'res_id' cannot be null 

有一种写这个的方法,以便我得到我需要的数据,但如果没有结果,那么也没有错误?

谢谢!

+0

什么是res_table的数据库结构 – RobertPitt 2010-09-11 16:30:17

+0

hi Robert-- res_table都是int值。 – julio 2010-09-11 16:39:00

回答

2
Select id, room_id, owner_id 
From Res_table 
    Left Join (
       Select R2.res_id, Min(R2.Date), Max(R2.Date) 
       From Res_table_mid As R2 
       Group By R2.res_id 
       ) As MinMax 
      On MinMax.res_Id = Res_table.Id 

在原始查询,无论派生表指示GROUP BY列。相反,你依靠MySQL猜测它应该通过res_id进行分组。如果我必须猜测,我会说这可能是问题的根源。

+0

谢谢Thomas!完美的工作,我很欣赏关于为什么的细节。 – julio 2010-09-11 16:45:56

0
SELECT a.id, 
     a.room_id, 
     a.owner_id, 
     MAX(m.date) AS end_date , 
     MIN(m.date) AS start_date 
FROM  res_table a 
     LEFT JOIN res_table_mid m 
     ON a.id = m.res_id 
GROUP BY a.id, 
     a.room_id, 
     a.owner_id; 
0
SELECT min(date) AS start_date FROM (
SELECT * FROM res_table a 
LEFT JOIN res_table_mid AS b 
ON a.id = b.res_id 
WHERE a.id = @reservation) 

SELECT max(date) AS end_date FROM (
SELECT * FROM res_table a 
LEFT JOIN res_table_mid AS b 
ON a.id = b.res_id 
WHERE a.id = @reservation)