2014-10-08 1 views
0

정확히 어떻게 호출해야하는지에 대한 질문이 있습니다. 어쩌면 난 그냥 올바른 이름을 사용하지 않기 때문에 대답을 찾을 수 없습니다.다른 where 절에 여러 요소가있는 MySQL을 ORDER BY

하지만이 경우는 다음과 같습니다.

  • booking_id (INT)
  • booking_start (Ymd 일수)
  • booking_starttime (H : ⅰ)
  • booking_hotelstart (Ymd 일수)
  • booking_hotelstarttime을 난 다음에 similair 데이터 데이터베이스 테이블을 (Ymd)
  • 예약 _ 호텔 엔드 (Ymd)
  • 예약 _ 호텔 종료 (H : i)
  • booking_end (Ymd 일수)
  • booking_endtime (H : I)
  • 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 절에 여러 조건을 가질 수

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

달성하고자하는 목표는 무엇입니까? –

+0

나는 쿼리와 일치하는 예약을 얻고 싶지만 개개의 조항으로 주문했다. –

+1

그 쿼리에서 성취하고자하는 것은 불가능하다. 하위 쿼리를 사용할 때까지 여러 차례의 주문은 불가능하다. 샘플 데이터와 원하는 결과를 게시하십시오. –

답변

0

. 그래서, 공식적으로, 당신이 원하는 것 : 당신이 상수 값을 비교 한 다음 그 값으로 정렬되어 있기 때문에

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; 

그러나, 이것은 조금 비 sensical입니다. 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)