MySQL ORDER BY在不同where子句中的多个元素

时间:2014-10-08 18:57:58

标签: mysql sql-order-by

我有一个问题,我不知道究竟如何称呼它。也许我只是不使用正确的命名,因此我找不到答案。

但情况是这样的。 我有一个带有similair数据的数据库表,如下所示:

  • booking_id(int)
  • booking_start(Y-m-d)
  • booking_starttime(H:i)
  • booking_hotelstart(Y-m-d)
  • booking_hotelstarttime(Y-m-d)
  • booking_hotelend(Y-m-d)
  • booking_hotelendtime(H:i)
  • booking_end(Y-m-d)
  • booking_endtime(H:i)
  • booking_confirmed(bool)

现在我想做一个关于此的查询: (无效查询仅用于演示我想要的内容)

SELECT `booking_id` FROM `system_bookings` WHERE (
(`booking_start`='2014-10-20' ORDER BY `booking_starttime` ASC)
OR
(`booking_hotelstart`='2014-10-20' ORDER BY `booking_hotelstarttime` ASC)
OR
(`booking_hotelend`='2014-10-20' ORDER BY `booking_endtime` ASC)

OR
(`booking_end`='2014-10-20' ORDER BY `booking_endtime` ASC)
)
AND
`booking_confirmed` = TRUE LIMIT 0, 100

所以基本上是带有子句的ORDER BY。但是怎么做?我不知道如何正确搜索这个。因此,我希望有人可以向我展示一下我应该前进的方向。除此之外。我想知道这是怎么称呼的。对于下一次搜索。

Thanx提前!!!


编辑:

我按要求创建了一些示例数据:

CREATE TABLE IF NOT EXISTS `system_bookings` (
  `booking_id` int(6) NOT NULL AUTO_INCREMENT,
  `booking_start` date NOT NULL,
  `booking_starttime` varchar(5) NOT NULL,
  `booking_hotelstart` date NOT NULL,
  `booking_hotelstarttime` varchar(5) NOT NULL,
  `booking_hotelend` date NOT NULL,
  `booking_hotelendtime` varchar(5) NOT NULL,
  `booking_end` date NOT NULL,
  `booking_endtime` varchar(5) NOT NULL,
  `booking_confirmed` tinyint(1) NOT NULL,
  PRIMARY KEY (`booking_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;



INSERT INTO `system_bookings` (`booking_id`, `booking_start`, `booking_starttime`, `booking_hotelstart`, `booking_hotelstarttime`, `booking_hotelend`, `booking_hotelendtime`, `booking_end`, `booking_endtime`, `booking_confirmed`) VALUES
(1, '2014-10-09', '21:19', '2014-10-08', '21:19', '2014-10-23', '08:00', '2014-10-23', '22:00', 1),
(2, '2014-10-11', '16:00', '2014-10-27', '12:15', '2014-10-28', '17:45', '2014-10-28', '17:45', 1),
(3, '2014-10-10', '20:30', '2014-10-10', '20:30', '2014-10-11', '08:00', '2014-10-20', '14:00', 1),
(4, '2014-10-12', '20:00', '2014-10-12', '20:00', '2014-10-13', '05:00', '2014-10-29', '22:00', 0),
(5, '2014-10-22', '15:00', '2014-10-22', '20:30', '2014-10-23', '04:15', '2014-10-31', '12:00', 1);

1 个答案:

答案 0 :(得分:0)

order by子句中可以有多个条件。所以,正式地说,你似乎想要这个:

SELECT `booking_id`
FROM `system_bookings`
WHERE `booking_confirmed` = TRUE AND
       (`booking_start` = '2014-10-20' OR
        `booking_hotelstart` = '2014-10-20' OR
        `booking_hotelend`='2014-10-20' OR
        `booking_end`='2014-10-20'
       )
ORDER BY (CASE WHEN `booking_start` = '2014-10-20' THEN `booking_starttime` 
               WHEN `booking_hotelstart` = '2014-10-20' THEN `booking_hotelstarttime`
               WHEN `booking_hotelend` = '2014-10-20' THEN `booking_endtime`
               WHEN `booking_end` = '2014-10-20' THEN `booking_endtime`
          END)
LIMIT 0, 100;

但是,这有点不敏感,因为您将值与常量进行比较,然后按该值进行排序。我怀疑你想优先考虑where条款,并且真的想要更像这样的东西:

ORDER BY (CASE WHEN `booking_start` = '2014-10-20' THEN 1
               WHEN `booking_hotelstart` = '2014-10-20' THEN 2
               WHEN `booking_hotelend` = '2014-10-20' THEN 3
               WHEN `booking_end` = '2014-10-20' THEN 4
          END)
相关问题