2013-08-21 5 views
0

У меня есть таблицы ресторанов и заказов, в таблице заказов у ​​меня есть restaurant_id, status и date полей - для каждого дня я сохраняю одну строку в таблице заказов. Если на какой-то день нет порядка - это означает, что в таблице заказов нет строки за этот день.left join with empty rows from right table mysql

Я хочу показать в календаре данные за текущий месяц для каждого ресторана в соответствии с этими двумя отдельными условиями.

1) in first case show only those restaurants that have at least one free 
day during this month(which means for this month at least one date is missing in orders table). 

2) in second case show only those restaurants that are free for today 
(which means there is no row for today in orders table) 

в обеих случаях, если условие выполнено, я должен принести все заказы на текущий месяц - это сложная часть.

Обычное антисоединение с левым или внутренним соединением не дает желаемого результата.

Спасибо.

редактировать

выходы должны быть такими

1) http://img826.imageshack.us/img826/3114/e6zt.png

2) http://img13.imageshack.us/img13/6397/44l0.png

+0

выборочные данные угодные –

+0

@PraveenPrasannan, делают снимки дают некоторое представление о том, что я хочу достичь? Спасибо – dav

ответ

1

Это все объявления в этом месяце для всех ресторанов, которые свободны сегодня:

SELECT r.`id`, r.`name`, o.`date`, o.`status`, o.`id` order_id 
FROM restaurants r 
     INNER JOIN orders o 
      ON r.id = o.restaurant_id 
     LEFT JOIN 
     ( SELECT DISTINCT o2.Restaurant_ID 
      FROM orders o2 
      WHERE o2.date = DATE(CURRENT_TIMESTAMP) 
     ) o2 
      ON r.id = o2.restaurant_id 
WHERE o.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01') 
AND  o.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01') 
AND  o2.Restaurant_ID IS NULL; 

Это просто получает все рестораны с заказом сегодня (подзапрос o2), затем исключает эти рестораны:

AND  o2.Restaurant_ID IS NULL; 

Это все объявления в этом месяце для всех ресторанов, которые имеют по крайней мере один свободный день этот месяц:

SELECT r.`id`, r.`name`, o.`date`, o.`status`, o.`id` order_id 
FROM restaurants r 
     INNER JOIN orders o 
      ON r.id = o.restaurant_id 
      AND o.date BETWEEN '2013-08-10' AND '2013-08-31' 
     INNER JOIN 
     ( SELECT o2.Restaurant_ID 
      FROM orders o2 
      WHERE o2.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01') 
      AND  o2.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01') 
      GROUP BY o2.Restaurant_ID 
      HAVING COUNT(DISTINCT o2.Date) < DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY)) 
     ) o2 
      ON r.id = o2.restaurant_id 
WHERE o.Date >= DATE_FORMAT(CURRENT_TIMESTAMP ,'%Y-%m-01') 
AND  o.Date <= DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'); 

хитрость заключается в том, чтобы получить количество дней в этом месяце:

DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY)) 

Затем ограничить результаты restaurant_id годов, которые имеют меньше заказов, чем это:

HAVING COUNT(DISTINCT o2.Date) < DAY(DATE_ADD(DATE_FORMAT(DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MONTH) ,'%Y-%m-01'), INTERVAL -1 DAY)) 

Example of Both on SQL Fiddle

+0

GarethD, Большое спасибо за ваше время и помощь! Я действительно ценю это. благодаря – dav