mysql - получает много результатов как количество входных параметров - PullRequest
0 голосов
/ 27 марта 2019

Я хочу выбрать цены за номер на 3 разных даты. У меня есть даты и номер комнаты. Таблица PRICES_CAL выглядит следующим образом:

id  room_id date_from   date_to   price 
1   1   2019-03-01  2019-04-01  100 
2   1   2019-04-02  2019-06-30  200 
3   1   2019-07-01  2019-08-31  400 
4   1   2019-09-01  2019-10-30  300 

Проблема в том, что мой запрос возвращает одну строку, когда все три даты находятся в одном интервале date_from - date_to.

Например, для поиска цен на даты 20190327, 20190328, 20190329, я использую запрос:

SELECT price 
FROM PRICES_CAL 
WHERE room_id = 1 AND ( 
      (date_from <= 20190327 AND date_to >= 20190327 ) 
   OR (date_from <= 20190328 AND date_to >= 20190328 ) 
   OR (date_from <= 20190329 AND date_to >= 20190329 ) 
) ORDER by date_from ASC; 

и, к сожалению, я получаю только один результат:

price
100 

Я хотел бы получить три строки результатов, по одной на каждую предоставленную мной дату.

Я уже пытался, среди других попыток «без надежды», поставить "SELECT RAND(), price ...", чтобы иметь разные строки для каждого условия ИЛИ и, надеюсь, получить 3 результата, но я все еще получаю один результат. Также это:

SELECT @mydd, price 
FROM PRICES_CAL 
WHERE room_id = 1 AND ( date_from <= @mydd AND date_to >= @mydd  ) 
AND @mydd in (20190327, 20190328, 20190329) 
ORDER by date_from;

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

Я хочу избежать выполнения 2 разных операторов для производительности или выбрать date_from, date_to, price и сделать сравнение с моими датами, чтобы определить, где моя средняя входная дата принадлежит.

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

100
100
100

ИЛИ даже лучше,

20190327 100
20190328 100
20190329 100

Любое предложение приветствуется. заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 27 марта 2019

Вы можете поместить запрошенные даты в отдельную (временную) таблицу, а затем объединить обе таблицы:

SELECT   my_dates_table.requested_date,
         prices_cal.price
FROM     my_dates_table
JOIN     prices_cal
  ON     prices_cal.room_id = 1
 AND     my_dates_table.requested_date BETWEEN prices_cal.date_from AND prices_cal.date_to
ORDER BY my_dates_table.requested_date;

Вы должны попробовать LEFT OUTER JOIN в случае, если интервалы не являются непрерывными (разрыв между некоторыми date_to и последовательными date_from).

Это, конечно, предполагает, что различные интервалы в таблице prices_cal различны.

0 голосов
/ 27 марта 2019

Другой вариант - использовать LEFT JOIN, например:

select
  x.d, p.price
from (
  select '2019-03-27' as d
  union all select '2019-03-28'
  union all select '2019-03-29'
) x
left join prices_cal p on p.date_from <= x.d
                      and date_to >= x.d
                      and p.room_id = 1
0 голосов
/ 27 марта 2019

Чтобы получить отдельные строки, вам нужно выполнить один запрос к дате, а затем UNION их. Например:

select *
from (
  SELECT '2019-03-27' as date_from, price 
  FROM PRICES_CAL 
  WHERE room_id = 1 AND date_from <= '2019-03-27' AND date_to >= '2019-03-27'
  UNION
  SELECT '2019-03-28' as date_from, price 
  FROM PRICES_CAL 
  WHERE room_id = 1 AND date_from <= '2019-03-28' AND date_to >= '2019-03-28'
  UNION
  SELECT '2019-03-29' as date_from, price 
  FROM PRICES_CAL 
  WHERE room_id = 1 AND date_from <= '2019-03-29' AND date_to >= '2019-03-29'
) x
order by date_from ASC; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...