2011-04-11 3 views
-1

예약되지 않은 좌석 만 반환하는 방법에 대해 혼란 스럽습니다.사용 가능한 자리 만 검색 중입니까?

내가

저장을 같은 테이블에 좌석 정보의이 개 장소를 제공 한 테이블 스키마 (50 석 각)

그때 만들기 위해 seatNumber 장소 및 예약 번호를 취하는 SeatBooking 테이블이 그것은 성능에 고유합니다.

많은 아이디어가 있습니다. 부울 데이터 유형이 Taken이면 True로 설정하고 가능한 경우 False로 설정된 SeatStatus라는 필드를 만듭니다. 그런 다음 쿼리가 SeatStatus = false 인 모든 위치를 반환합니다.

이 상황에서이 작업을 수행 할 수 있습니까?

답변

0

이것은 수행하는 언어와 관련이 없지만 SQL LEFT JOIN을 사용하여이 작업을 수행합니다.

기본적으로이 유형의 참여는 왼쪽이 있음 (이 경우 좌석표)이지만 오른쪽 (예약 정보)이 아닐 수도 있으므로 null을 얻을 수 있다고 말합니다. 왼쪽 시트 정보 테이블을 좌석 예약 테이블에 가입하고 정보를 찾고있는 성능을 선택하십시오. 최종 조건으로 예약 정보가 null인지 확인하십시오. 예약 정보가 없으면 좌석이 예약되지 않았으므로 예약 정보가 null인지 확인하십시오.

SQL 테이블이 최적화되어 있고 결과적으로 예약이 불가능한 경우에만 코드가 필터링 될 필요가 없으므로 매우 빠릅니다. SQL 서버는 당신에게 힘든 일을합니다. (일반적으로 가장 효율적인 방법입니다)

빠른 속도로 작성해야하는 색인은 예약 번호 표의 좌석 번호 및 실적에 있습니다.

SELECT seat.* FROM seating seat LEFT JOIN bookings book ON seat.number = book.seat_number,book.performance = 'SOME PERFORMANCE ID' WHERE seat.venue = 'SOME VENUE' AND book.performance is null; 

이없이 시도 'AND book.performance가 null의'첫 번째,뿐만 아니라 예약 테이블을 선택하면 모든 데이터를 얻고 있는지 확인 : 여기

이 쿼리의 일반적인 형태입니다 , 그리고 중요하게는 좌석 당 단 하나의 행.

+0

또한 booking.seat_number 및 booking.performance가 고유 인덱스 또는 기본 키인지 확인하고자 할 수 있습니다. 이렇게하면 단일 성능에 대해 동일한 예약을 이중 예약 할 수 없으며이 쿼리 중에 중복 행을 얻을 수 없습니다. – SplinterReality

관련 문제