2017-01-13 3 views
0

У меня есть две таблицы: зоны и резервированиелевой присоединиться сложным, где положение

zones 
----- 
id:int 
name:varchar 
slots:int 

reservations 
------------ 
zone:int 
timestamp:long 

И мне нужно, чтобы получить все зоны с числом активных оговорок (оговорки, с отметкой времени меньше, чем reftimestamp не должно считаться активным).

EDIT OK С помощью этого запроса, я получаю лучший результат:

SELECT z.name, count(r.timestamp) 
    FROM zonas AS z 
    LEFT JOIN reservations AS r 
    ON z.id = r.zona 
    WHERE r.timestamp > $refTimestamp 
    GROUP BY z.id 

Но я хочу, чтобы все зоны. Даже если на другом столе нет резервирования, он должен вернуть зону с нулем (0) на счетчик (r.timestamp)

Как это сделать?

+0

И что именно не хватает? Как ваши результаты отличаются от ваших ожиданий? –

+0

Попробуйте 'ON z.id = r.zona И r.timestamp> $ reftimestamp'. Наверное, у вас отсутствуют зоны, у которых нулевые резервирования в вашем результате? –

+0

@David Lively это просто не работает (count (r. *)) –

ответ

1

Я думаю, что вам нужно это:

SELECT z.name, 
     sum(case when r.timestamp is null then 0 
       when r.timestamp > $refTimestamp then 1 
       else 0 end) 
    FROM zonas AS z 
    LEFT JOIN reservations AS r 
    ON z.id = r.zona 
GROUP BY z.id 

Это поможет вам все зоны.

Просмотреть действующую форму: http://sqlfiddle.com/#!9/6c37e8/1

+0

такой же результат ... если нет строки резервирования, связанной с зоной, зона просто не появится:/ –

+0

@SebastianBreit исправил ее. попробуйте сейчас, пожалуйста, –

+0

К сожалению, к тому времени, когда я прошу вас протестировать его, произошла ошибка опечатки, я вставил решение без удаления неправильной версии. Теперь это исправлено. –

0

Использование

SELECT z.*, count(r.*) 
FROM zonas AS z 
LEFT JOIN reservations AS r 
ON z.id = r.zona 
AND r.timestamp > $reftimestamp 
GROUP BY z.id 

Как Вы можете видеть, я переместил состояние WHERE в LEFT JOIN ... ON. В вашем случае база данных сначала выполняет левое соединение - строки, которые не имеют резервирования, имеют NULL в качестве метки времени, поэтому они не могут пройти через условие WHERE (поскольку NULL > whatever является ложным).

Смотрите же скрипку - http://sqlfiddle.com/#!9/124cc7/5

+0

Спасибо, но это даст мне только зоны, для которых есть в аренде одна оговорка. Если для зоны нет резервирования, она не появится с этим запросом. –

Смежные вопросы