我想选择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,price并与我的日期进行比较,以确定我的中间输入日期所属的位置。
理想的情况是仅使用一个query.execute解决问题。 在检索结果集并从表中选择所有内容时,我可以使用while语句中的代码进行排序,但是我也想学习如何使用查询。 理想的解决方案是获得三个结果
100
100
100
或者更好,
20190327 100
20190328 100
20190329 100
任何建议都值得欢迎。预先感谢。
答案 0 :(得分:0)
要获取单独的行,您需要每个日期运行一个查询,然后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;
答案 1 :(得分:0)
您可以将请求的日期放在单独的(临时)表中,然后将两个表结合在一起:
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
表中的各个间隔是不同的。
答案 2 :(得分:0)
另一种选择是使用.image
,如下所示:
def update_screen(rainfall):
screen.fill((135, 206, 235))
print(len(rainfall))
rainfall.update();
rainfall.draw(screen)
pygame.display.flip()
while run:
update_screen(rainfall)