我想选择3个不同日期的房间价格。我有日期和room_id。 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 ..."
以便为每个OR条件设置不同的行,并希望得到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、价格并与我的日期进行比较,以确定我的中间输入日期属于哪里。
期望的情况是仅使用一个查询来解决问题。 在检索结果集并从表中选择所有内容时,我可以使用 while 语句中的代码对其进行排序,但我还想学习如何使用查询来做到这一点。 所需的解决方案是有三个结果
100
100
100
甚至更好,
20190327 100
20190328 100
20190329 100
欢迎任何建议。 提前谢谢。
若要获取单独的行,需要为每个日期运行一个查询,然后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;
另一种选择是使用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
您可以将请求的日期放在单独的(临时)表中,然后连接两个表:
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
表中的各种间隔是不同的。