我有一张桌子,用于存储房间的预订,以及我想要的每个房间,按PHP日期选择预订。这是查询:
SELECT id_prenotazione, id_alloggio, FROM_UNIXTIME(data_checkin,'%d/%m/%Y') AS checkin,
FROM_UNIXTIME(data_checkout,'%d/%m/%Y') AS checkout, pagata, esclusiva
FROM prenotazioni
WHERE id_alloggio = $id_alloggio
AND FROM_UNIXTIME(data_checkin,'%d/%m/%Y') >= ".$data."
OR FROM_UNIXTIME(data_checkout,'%d/%m/%Y') <= " .$data.")
ORDER BY checkin ASC
LIMIT 1;
但如果同一房间有两个或两个以上的预订,则查询始终返回第一个预约,而如果我将“ASC”更改为“DESC”,则仅返回最后一个预约。我希望在特定日期($ data)中预订特定房间($ id_allogio)。我究竟做错了什么?提前感谢您的回答。
答案 0 :(得分:0)
为什么不使用between语句:
SELECT col1,col2,col3,col4,blabla
FROM prenotazioni
WHERE
id_alloggio = $id_alloggio
and FROM_UNIXTIME(data_checkin,'%d/%m/%Y') between date_1 AND date_2
ORDER BY checkin ASC
LIMIT 1;
答案 1 :(得分:0)
您的问题很难确切地告诉您需要什么。您似乎需要在特定日期看到与特定房间匹配的单个预订。
但是如果一天有多个房间预订,你就不会告诉我们会发生什么。也就是说,如果存在超量预订,您不会告诉我们应该发生什么。
无论如何,处理TIMESTAMP
(即UNIXTIME)数据项的方案不是很好。
我建议你修改你的查询如下:
SELECT id_prenotazione,
id_alloggio,
FROM_UNIXTIME(data_checkin,'%d/%m/%Y') AS checkin,
FROM_UNIXTIME(data_checkout,'%d/%m/%Y') AS checkout,
pagata,
esclusiva
FROM prenotazioni
WHERE id_alloggio = $id_alloggio
AND STR_TO_DATE($data, '%d/%m/%Y') >= data_checkin
AND STR_TO_DATE($data, '%d/%m/%Y') < data_checkout + INTERVAL 1 DAY
ORDER BY checkin ASC
我在这里做了什么改变?
首先,我将您的演示风格日期(代表2013年12月17日为2013年12月17日)转换为内部MySQL本机日期格式,之前使用它来进行比较,使用不等式{ {1}}和>=
。有必要这样做。当您比较<
和17/12/2013
等字符串时,您会得到错误的排序。
此外,我编写查询的方式允许MySQL使用索引来满足它。
其次,我将结帐比较更改为
18/11/2013
这是因为您似乎正在使用包含日历日期和时间的 parameter-date < data_checkout + INTERVAL 1 DAY
和data_checkin
数据类型。我使用的比较允许在data_checkout
显示午夜以外的结帐时间时结果正确。
最后,我摆脱了LIMIT 1.在我看来,你需要知道特定日期的房间是否有多个预订。
答案 2 :(得分:0)
我用这种方式解决了问题:
我重写了你给我的信息的查询:
SELECT id_prenotazione,id_alloggio,data_checkin,data_checkout,pagata,esclusiva 来自prenotazioni WHERE id_alloggio = $ id_alloggio AND'$ data'&gt; = data_checkin AND'$ data'&lt; data_checkout + INTERVAL 1 DAY
通过这些更正,查询重新计算特定日期内特定房间的单一预订。 谢谢您的有用答案!