MySQL оставил присоединиться к вопросу - PullRequest
0 голосов
/ 11 сентября 2010

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

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

Res_table: id, room_id, owner_id

Res_table_mid: id, res_id, date

Столбец 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

Есть ли способ написать это так, чтобы я получал нужные мне данные, но если нет результатов, то также нет ошибки?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 11 сентября 2010
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 голосов
/ 11 сентября 2010
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)
0 голосов
/ 11 сентября 2010
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;
...