2009-08-19 2 views
3

나는 현재 장비의 특정 부분을 예약하는 사람들을 위해 사용하고있는 3 개의 테이블을 가지고 있습니다.준결승 PHP/MySQL 선택 진술

tblEquipment: 
    id  name  description 
    1  Camera  Takes pictures 
    2  Projector  Projects pictures 
    3  Laptop   Portable Computer 


tblEvents: 
    id  start     end    first_name   last_name    email 
    1  2009-08-10  2009-08-11   John     Doe     [email protected] 
    2  2009-08-15  2009-08-16   Jane     Doe     [email protected] 


tblEventData: 
    id   eventID    equipmentID 
    1    1       1    
    2    1       2 

지금, 사용자가 그 때 사용할 수있는 모든 장비를 볼 수 있습니다, 자신의 요청 시간으로 쿼리를 제출합니다 : 여기

내 테이블입니다.

위의 예를 사용하여 사용자가 8/10-8/11 사이의 장비를 찾고있는 경우 사용할 수있는 장비는 equipmentID 3 (노트북)뿐입니다.

요청한 시간에 따라 사용 가능한 장비 만 반환하도록 쿼리를 만들려면 어떻게해야합니까?

이것은 내가 지금까지 마련했지만,이 동작하지 않습니다 무엇 :

SELECT tblequipment.id as name, tblEvents.start as start, tblEvents.end as end 
FROM tblEquipment 
INNER JOIN tblEventData on tblEventData.equipmentID = tblEquipment.id 
INNER JOIN tblEvents on tbleventdata.eventID = tblEvents.id 
WHERE NOT EXISTS(SELECT * FROM tblEvents WHERE $end >= start AND $start <= end) 

어떤 아이디어? 감사!

답변

2

쿼리에 주어진 이벤트에 대해서만 주어진 시작 시간과 종료 시간 사이에 발생하는 NOT EXISTS가 있습니다. 즉, "이 시간대에 이벤트가없는 한 모든 장비를 선택하십시오." 그것은 당신이 원하는 것이 아닙니다. 원하는 : "이벤트가없는 한 모든 장비를 선택하십시오 해당 장비를 사용하십시오이 시간대에 있습니다."

SELECT tblequipment.id as name 
FROM tblEquipment 
WHERE NOT EXISTS 
    (SELECT * FROM tblEvents 
    INNER JOIN tblEventData ON (tblEvents.id = tblEventData.eventID) 
    WHERE $end >= start AND $start <= end 
    AND tblEventData.equipmentID = tblEquipment.id) 

편집 : 같은 것으로 변환

또한, 외부 쿼리에서 JOIN의 제거했습니다 그들은 당신이 어떤 점에서 예약 유일의 장비 을 선택한다고 주장하기 때문에 당신이 대답하려고하는 질문과는 전혀 관련이 없습니다.

최종 결과에서 제외 할 목적으로 어떤 장비가 예약되었지만 NOT EXISTS 쿼리 내부에 있는지 알고 싶습니다. 이

`end`

내가 MySQL의 명령이 아닌 필드로 끝을 해석하는 생각하므로 따옴표로 끝을 넣어

+0

그러나 답장을 보내 주셔서 감사합니다, VoteyDisciple, 그러나 이제 오류가 발생합니다 : 알 수없는 열 'tblEquipment.equipmentID'where 절 '어떤 생각? –

+0

원본 스키마를 잘못 읽었습니다. 그 이름의 란은 실제로 없다. 당신은 tblEquipment.id라는 이름을 붙였습니다 - 나는 또 다른 변화와 함께 적절한 편집을 할 것입니다. – VoteyDisciple

+0

마지막 부분은 tblEventData.equipmentID = tblEquipment.id이어야합니다. – localshred

1

"end"는 SQL의 예약어입니다. tblEvents.end에 다른 이름을 지정해보십시오.

+0

좋은 지적, thx. 나는 앞서 가서 startTime과 endTime까지 컬럼 이름을 변경했다. – Dodinas