2014-01-14 135 views
0

该查询返回is_message =“上”行和mass_message =“上”查询不能返回正确的行

SELECT * 
FROM `messages` 
WHERE 
    (`sender_id` = '111' AND `recipient_id` = '222') 
    OR (`sender_id` = '222' AND `recipient_id` = '111') 
    AND (`is_message` != 'on' OR `is_message` IS NULL) 
    AND (`mass_message` != 'on' OR `mass_message` IS NULL) 
    AND `invite_for_lunch` = 'on' 
LIMIT 0 , 30 

如何确保它只返回“上”

invite_for_lunch =行

这原本是一个计数,但我想看看哪些行正在返回。

我检查了列,没有两列(is_message,mass_message,invite_for_lunch)在同一行有on

预期结果:应该返回5行

+0

只有'invite_for_lunch ='on''你的其他支票呢?你在那里放了很多OR。 –

+1

这看起来像它会做你想要的'AND invite_for_lunch ='on'',这是不是返回你期待的结果?你能发表一个你的源数据的例子,你期待什么,你究竟得到了什么? –

+1

我修复了缩进,这可以使识别逻辑问题更容易。 –

回答

2

尝试修复您的括号

SELECT * 
FROM `messages` 
WHERE 
( 
     (`sender_id` = '111' AND `recipient_id` = '222') 
    OR (`sender_id` = '222' AND `recipient_id` = '111') 
) 
    AND (`is_message` != 'on' OR `is_message` IS NULL) 
    AND (`mass_message` != 'on' OR `mass_message` IS NULL) 
    AND `invite_for_lunch` = 'on' 
LIMIT 0 , 30 

如果没有额外的括号,第一或最有可能被不当

+0

TH返回零行,当它应该返回5 –

+0

原始查询返回47行,并且它应该只返回5 –

+0

为什么你认为它应该重新生成五条记录? – HLGEM

0

更改您的WHERE

WHERE ((`sender_id` = '111' 
      AND `recipient_id` = '222') 
     OR (`sender_id` = '222' 
      AND `recipient_id` = '111') 
    ) 
    AND .... 
+0

与@sparky的答案相同,并且返回相同的结果0行 –

0

也许这是你想要的吗?

SELECT <Insert columns names here as select * is a SQL antipattern> 
FROM `messages` 
WHERE 
( 
     (`sender_id` = '111' AND `recipient_id` = '222') 
    OR (`sender_id` = '222' AND `recipient_id` = '111') 
) 
    AND 
    (
     (`is_message` != 'on' OR `is_message` IS NULL) 
    OR (`mass_message` != 'on' OR `mass_message` IS NULL) 
    ) 
    AND `invite_for_lunch` = 'on' 
LIMIT 0 , 30 
+0

我会试试这个并返回 –

+0

nope,结果相同。 –