我有一个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
看起来好像被忽略了。 (我得到的行中有很多NULL)
任何人都知道发生了什么事?
答案 0 :(得分:3)
在您的条件之间使用适当的多级括号。 您在最后一部分中使用过括号,但前几个条件的AND,OR也需要括起来。
答案 1 :(得分:3)
请查看the operator precedence of mysql。 OR
的优先级低于AND
,因此您必须将其放入大括号中才能获得所需的结果:
client.typ = 'U'
OR
client.typ is null
完整的WHERE-block应如下所示:
(
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
)
)
答案 2 :(得分:0)
!ISNULL('zahlung.zuUebBet')
尝试这一个而不是zahlung.zuUebBet IS NOT NULL
。我仍然没有解释为什么这样做,但它确实改变了我不止一次的结果。
对于任何更了解MySQL的人,请解释为什么!ISNULL(<row>);
!= <row> IS NOT NULL
。