2014-10-08 73 views
0

我有一個問題,我不知道該怎麼稱呼它。也許我只是不使用正確的命名,因此我找不到答案。MySQL ORDER BY不同where子句中的多個元素

但情況是這樣的。 我有similair數據的數據庫表來執行以下操作:

  • booking_id(INT)
  • booking_start(YMD)
  • booking_starttime(H:ⅰ)
  • booking_hotelstart(YMD)
  • booking_hotelstarttime (Ymd)
  • booking_hotelend(Ymd)
  • booking_hotelendtime(H:i)
  • booking_end(年月日)
  • booking_endtime(H:1)
  • booking_confirmed(布爾)

現在我想提出一個查詢,確實這個問題: (無效的查詢只是爲了證明什麼我想)

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); 
+0

你究竟想要達到什麼目的? – 2014-10-08 19:00:35

+0

我想獲得與查詢相匹配的預訂,但也按單個條款排序 – 2014-10-08 19:01:49

+1

您試圖從該查詢中實現的內容是不可能的,直到您使用子查詢時纔可能使用多個順序。請張貼一些樣本數據和期望的結果。 – 2014-10-08 19:03:38

回答

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)