2010-09-11 4 views
0

У меня есть две таблицы, одна из которых зарезервировала номер для комнаты, а другая представляет собой «среднюю» таблицу для хранения дат, на которых зарезервирована комната (так как резервирование может иметь несколько непоследовательных даты).mysql left join question

Это выглядит примерно так:

Res_table: идентификатор, room_id, owner_id

Res_table_mid: идентификатор, res_id, дата

res_id колонка в res_table_mid ссылается на идентификатор res_table. Мне нужно получить дату начала и окончания бронирования.

Так что запрос выглядит примерно так:

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

+0

hi Robert-- res_table - все значения int. – julio

ответ

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 

В исходном запросе, ни Производная таблица указывает на группу по столбцам. Вместо этого вы полагаетесь на MySQL, чтобы предположить, что он должен группироваться с помощью res_id. Если бы мне пришлось догадываться, я бы сказал, что это может быть источником проблемы.

+0

Спасибо Томас! который отлично работал, и я ценю детали о том, почему. – julio

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)