SQL语句将结果分组为两行以创建时间表

时间:2018-01-01 19:07:04

标签: php mysql

我目前有一个记录工作预订的数据库表 并且有8个时隙可用

+-----------+
|tbl_booking|
+-----------+
|room_id    |
|date       |
|timeslot   |
|booking    |
+-----------+


sample data
+-----------+----------+-----------+
|room_id    | date     | timeslot  |
+-----------+----------+-----------+
|1          |2018-01-01|  1        |
|1          |2018-01-01|  2        |
|1          |2018-01-01|  4        |
|2          |2018-01-01|  1        |
+-----------+----------+-----------+

intended outcome - when statement filters for bookings on 2018-01-01
+-----------+----------+-----------+----------+-----------+
|room       |timeslot1 | timeslot2 |timeslot3 | timeslot4 |
+-----------+----------+-----------+----------+-----------+
|1          |    X     |     X     |          |    X      |
|2          |    X     |           |          |           |
+-----------+----------+-----------+----------+-----------+

我从这句话开始:

SELECT * from tbl_booking WHERE date = '2018-01-01' GROUP BY room_id

这将返回结果以查看按房间分组的结果。 我想知道我应该从这里去哪里也有结果显示它的时间段显示在当天eacah房间时间段的预订状态的表中?

是否应该使用我应该使用的SQL语句,或者我是否完全在错误的轨道上?

任何帮助将不胜感激。 谢谢!

2 个答案:

答案 0 :(得分:1)

您想要对数据做什么并不好,如果您有固定数量的时间段,那么您可以像这样对列进行硬编码:

<input type="submit" name="commit" value="add to cart" class="button">

(见SQL Fiddle

如果您只想查看是否存在至少1个预订,则可以使用SELECT room_id, SUM(CASE WHEN timeslot = 1 then 1 else 0 END) AS Timeslot1, SUM(CASE WHEN timeslot = 2 then 1 else 0 END) AS Timeslot2, SUM(CASE WHEN timeslot = 3 then 1 else 0 END) AS Timeslot3, SUM(CASE WHEN timeslot = 4 then 1 else 0 END) AS Timeslot4 FROM tbl_booking GROUP BY room_id

要包含备注的SQL,您可以通过MAX

来欺骗它以通过分组选择备注
MAX

您的延长SQL Fiddle。这不适用于仅有1个选定日期的多个日期

答案 1 :(得分:-1)

如果您正在寻找动态解决方案,那么您必须使用数据透视表。

选择*来自 (从yourtable中选择*)as 不是Temptable 枢轴( 伯爵(室) 对于时间段 在(时段列表)) 作为tempSlot

有关详细信息,请查看此链接MySQL pivot table