Чтобы проверить дату в одной таблице не существует в период бронирования во 2-й таблице - PullRequest
0 голосов
/ 21 декабря 2011


Я новичок в этом, потратив 2 дня, пытаясь найти ответ в сети Я пытаюсь построить оператор выбора MYSQL

У меня 2 таблицы на etat содержит список дат и цен, вторая - это таблица дат бронирования с началом и окончанием. Я стараюсь показать БЕСПЛАТНЫЕ даты и цены в Таблице 1, которые НЕ существуют ни в одной из записей бронирования в Таблице 2

Таблица 1 называется - даты_цены -
id, дата, цена

пример данных

333, 2011-12-20, 66.00
333, 2011-12-21, 66.00
333, 2011-12-22, 66.00
333, 2011-12-23, 66.00
333, 2011-12-24, 66.00
333, 2011-12-25, 66.00
333, 2011-12-26, 66.00
333, 2011-12-27, 66.00
333, 2011-12-28, 66.00
333, 2011-12-29, 66.00
333, 2011-12-30, 66.00

Таблица 2 - Бронирование

идентификатор, начальная дата, конечная дата

пример данных

333, 2011-12-20, 2011-12-22
333, 2011-12-24, 2011-12-26
333, 2011-12-28, 2011-12-30

Мне нужно извлечь ТОЛЬКО даты из Таблицы 1, которых нет в записях Таблицы 2, между датами начала и окончания всех записей в Таблице 2 с одинаковым идентификационным номером 333

Таким образом, единственными записями, которые должны отображаться из таблицы 1, являются следующие

id, дата, цена

333, 2011-12-23, 66.00
333, 2011-12-27, 66.00
333, 2011-12-31, 66.00

Ответы [ 4 ]

1 голос
/ 21 декабря 2011
SELECT p1.* FROM dates_prices p1 
WHERE (p1.id, p1.date) NOT IN
(
  SELECT p2.id, p2.date
  FROM dates_prices p2
  JOIN reservations r
  ON  (
     r.id = p2.id 
     and r.startdate <= p2.date 
     and p2.date <= r.enddate
  )
)
1 голос
/ 21 декабря 2011

Я обновил запрос, чтобы исключить даты.

select dp.id, dp.date, dp.price
  from dates_prices dp
   left join 
     (select dp.id, dp.date
       from dates_prices dp
       join reservations res 
        on res.id = dp.id 
         and dp.date between res.startdate and res.enddate) as inner_table
     on inner_table.id = dp.id and inner_table.date = dp.date
   where inner_table.id is null 
0 голосов
/ 22 декабря 2011
create table  table12 (id int, datefor date, price int)

insert  into  table12
select 333, '2011-12-20', 66.00
union all
select 333, '2011-12-21', 66.00
union all
 select 333, '2011-12-22', 66.00
 union all
 select 333, '2011-12-23', 66.00
 union all
select 333, '2011-12-24', 66.00
union all
 select 333, '2011-12-25', 66.00
 union all
 select 333, '2011-12-26', 66.00
 union all
 select 333, '2011-12-27', 66.00
 union all
 select 333, '2011-12-28', 66.00
 union all
 select 333, '2011-12-29', 66.00
 union all
 select 333, '2011-12-30', 66.00 

 create table  table2 (id int, startdate date, enddate date)

insert  into  table2
select 333, '2011-12-20', '2011-12-22'
 union all
 select 333, '2011-12-24', '2011-12-26'
 union all
 select 333, '2011-12-28', '2011-12-30'

попробуйте после создания таблиц выше. Решение для вашей проблемы необходимо сделать этот тип запроса к таблицам, т.е. выберите * из таблицы 12, где дата не должна находиться между «2011-12-20» и «2011-12-22», а дата не должна находиться между «2011-12-24» и «2011-12-26», а дата не должна находиться между «2011-12» -28 'и' 2011-12-30 'и table12.id = 333 Я сделал один процесс, просто вам нужно передать свой идентификатор.

create proc solution( @id int) 
  as
  begin

declare @count int
    declare @i int
    declare @query varchar(800)
    set @query=''
 declare @startdate varchar(80)
    set @startdate=''
     declare @enddate varchar(80)
    set @enddate=''

 declare @table table( row int ,startdate date,enddate date,id int)
insert into @table select row_number() over(order by (select 1)) as rownumber  ,startdate,enddate,id  from  table2  where table2.id=@id
 set  @count=(select COUNT (*)  from  @table )
 set   @i=1
 set @query += 'select * from  table12 where '
while @count>=@i
begin
 set @startdate=( select startdate  from  @table  where row=@i) 
 set  @enddate =(select enddate  from  @table  where row=@i)
 set @query +=  ' datefor not between '+''''+@startdate+''''+ ' and '+'''' +@enddate+''''
 if   @count>@i
 begin
 set @query +=' and  '
 end
 if @count=@i
 begin
 set @query += ' and  table12.id='+cast (@id as varchar(50)) +''
 end 

set @i+=1
 end
 if(@i=1)
 set @query+='table12.id='+cast (@id as varchar(50)) +''


  exec (@query)
end

exec solution 333
0 голосов
/ 21 декабря 2011

Это тоже должно работать, может быть намного быстрее:

SELECT p1.* FROM dates_prices p1 
WHERE NOT EXISTS
(
  SELECT * FROM reservations r
  WHERE r.id = p1.id 
  AND r.startdate <= p1.date 
  AND p1.date <= r.enddate  
)
...