2011-02-01 4 views
1

나는 MySQL의 쿼리처럼 보이는이 :어디에 영향을 미치지 않습니다. 왜?

SELECT 
    client.id, client.vorname, client.nachname, DATE_FORMAT(geburtsDatum, '%d.%m.%Y'), zahlung.zuUebBet, zahlung.betrag 
FROM 
    zahlung JOIN client ON (zahlung.mitgliedsNr = client.id) 
WHERE 
    client.typ = 'U' 
OR 
    client.typ is null 
AND 
    zahlung.typ = 'Beitrag' 
AND 
    anBGueberwiesen = '0000-00-00' 
AND 
    zahlung.zuUebBet IS NOT NULL 
AND 
    (
    zahlung.vomBGeinheb = 0 
    OR 
    zahlung.vomBGeinheb is null 
) 

모든 잘 작동하지만 경우 :

zahlung.zuUebBet IS NOT NULL 

무시에 beeing 모양입니다. (나는 그것에 NULL을 많이 가진 행을 얻는다)

누구나 무슨 일이 벌어지고 있는지 알 수 있을까?

+0

다음 번에 코드를 좀 더 읽기 쉽도록 포맷하십시오 (이번에는 그랬습니다) – oezi

답변

3

the operator precedence of mysql을 참조하십시오. ORAND보다 낮은 우선 순위를 가지고, 그래서 당신이 원하는 결과를 얻으려면 괄호로이를 넣어야 할 것이다 : 전체 WHERE 블록은 다음과 같이한다

client.typ = 'U' 
OR 
    client.typ is null 

: 그렇지

(
    client.typ = 'U' 
    OR 
    client.typ is null 
) 
AND 
    zahlung.typ = 'Beitrag' 
AND 
    anBGueberwiesen = '0000-00-00' 
AND 
    zahlung.zuUebBet IS NOT NULL 
AND 
    (
    zahlung.vomBGeinheb = 0 
    OR 
    zahlung.vomBGeinheb is null 
) 

을, 은 SQL 문은 다음과 같이 취급 될 것이다 (나는 분명히 일을 할 중괄호를 추가 한) (느릅 나무는 당신이 원하는 것이 아니다, 나는 생각한다) :

client.typ = 'U' 
OR 
    (
    client.typ is null 
    AND 
    zahlung.typ = 'Beitrag' 
    AND 
    anBGueberwiesen = '0000-00-00' 
    AND 
    zahlung.zuUebBet IS NOT NULL 
    AND 
    (
     zahlung.vomBGeinheb = 0 
    OR 
     zahlung.vomBGeinheb is null 
    ) 
) 
+0

thanks thanks thanks :) –

+0

gern geschehen;) – oezi

3

사이에 적절한 다중 레벨 괄호를 사용하십시오. 마지막 부분에 괄호를 사용했지만 처음 몇 조건에 대한 AND, OR도 괄호로 묶어야합니다.

0

!ISNULL('zahlung.zuUebBet') 대신 zahlung.zuUebBet IS NOT NULL을 입력하십시오. 나는 왜 이것이 작동하는지 아무런 설명이 없지만, 그것은 한 번 이상 결과를 바꾸어 놓았다.

더 많은 지식이있는 사용자는 !ISNULL(<row>);! = <row> IS NOT NULL입니다.

관련 문제