2010-09-13 237 views
0

我需要一个正确的方法来编写一个简单的WHERE,AND,OR语句。这一个不工作:Mysql select语句

SELECT `content` 
    FROM `bx_wall_events` 
WHERE `type` = 'wall_common_text' 
    OR `type` = 'wall_common_fb' 
    OR `type`= 'wall_common_tw' 
    AND `owner_id`='{$iId}' 
ORDER BY `date` DESC 
    LIMIT 1 

回答

5

这是一个有效的陈述,但我想象的问题是ORs没有像你期望的那样被解释。使用语法来代替:

SELECT content 
    FROM bx_wall_events 
    WHERE `type` IN ('wall_common_text', 'wall_common_fb', 'wall_common_tw') 
    AND `owner_id` = '{$iId}' 
ORDER BY `date` DESC 
    LIMIT 1 

我删除了在特定的地点的反引号,因为他们只为逃避正在使用MySQL reserved keywords表&列名必需的。

的方式是:

WHERE `type` = 'wall_common_text' 
    OR `type` = 'wall_common_fb' 
    OR `type`= 'wall_common_tw' 
    AND `owner_id`='{$iId}' 

...正在评估是:

WHERE (`type` = 'wall_common_text') 
    OR (`type` = 'wall_common_fb') 
    OR (`type`= 'wall_common_tw' AND `owner_id`='{$iId}') 
+0

您也可以在ORs旁边放置圆括号以将它们与AND分开,但我确实认为这是要走到这里的路。 – 2010-09-13 21:52:30

+0

@迈克尔马德森:你可以,但“IN”更易于维护 - 错过或放错了一个括号,查询可以是有效的,但不会返回正确的数据。在'IN'上错过一个括号,并保证语法错误。 – 2010-09-13 21:55:00

0

“选择content FROM bx_wall_events WHERE((type = 'wall_common_text')||(type = 'wall_common_fb')||(type = 'wall_common_tw')) AND owner_id ='{$ iId}'ORDER date DESC LIMIT 1“

+2

双管是字符串连接的最佳解决方案。 .. – 2010-09-13 21:49:23

+0

在MySQL中,默认情况下,||是一个逻辑OR运算符。启用PIPES_AS_CONCAT后,||是字符串连接(请参阅http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html) – 2010-09-13 21:54:41

+0

@martin clayton:不知道,但我确实知道如果启用严格的SQL然后双管道是字符串连接... – 2010-09-13 22:04:18

0

发现使用IN

在SQL
"SELECT `content` 
FROM `bx_wall_events` 
WHERE `owner_id`='{$iId}' 
AND `type` 
IN ('wall_common_text', 'wall_common_fb', 'wall_common_tw') 
ORDER BY `date` 
DESC LIMIT 1"