2014-02-28 4 views
0

그래서이 행 WHERE s.status = 'pending'까지 데이터가 'closed'으로 반환 될 때까지 정상적으로 작동하는 쿼리가 있습니다. 보류 중, 폐쇄 중 및 라이브 중이 데이터 섹션에는 3 가지 옵션 만 있습니다.잘못된 데이터를 반환하는 SQL 쿼리가 매우 이상합니다.

나는 왜이 일을하는지 전혀 모르겠다. 나는 같은 쿼리를 사용하지만 페이지의 다른 섹션 (이 쿼리 아래에서 변수가 충돌하지 않아야 함)에 status = 'closed'을 가지고 있는데, 왜 이것이 지금이 방법으로 행동할까요?

SELECT s.gameid, s.gameday, s.hometeam AS hid, ht.teamname AS homename, s.awayteam AS aid, at.teamname AS awayname, s.status 
FROM schedule s 
    INNER JOIN teams ht ON s.hometeam = ht.teamid 
    INNER JOIN teams at ON s.awayteam = at.teamid 
WHERE s.status = 'pending' AND s.hometeam = $tid OR s.awayteam = $tid ORDER BY s.gameday ASC LIMIT 5 
+0

'AND'와'OR'을 섞을 때 항상 참이어야하는 것과 무엇이 선택적인지를 명확히하기 위해'()'를 사용하십시오. – Wrikken

답변

6

가 감싸고 OR는 괄호 안의 WHERE 절 부분 D '.

WHERE s.status = 'pending' AND (s.hometeam = $tid OR s.awayteam = $tid) 
ORDER BY s.gameday ASC LIMIT 5 

원래 쿼리를 효율적입니다 : 분명히 잘못된

WHERE (s.status = 'pending' AND s.hometeam = $tid) OR s.awayteam = $tid 

이다. MYSQL's operator precedence을 보면 ANDOR보다 우선합니다.

+0

감사합니다. 완벽하게 작동했습니다. – user934902

관련 문제