OR和AND组合失败MySQL

时间:2013-05-08 21:48:03

标签: php mysql sql select

我试图找出要使用的mysql代码。我尝试了以下脚本,其中包含我需要的所有搜索功能:

SELECT * FROM `zk_posts` WHERE `form_id` IN (3,6) 
AND FROM_UNIXTIME(published, '%Y') = 2013 
AND `message` LIKE '%search%' 
OR `description` LIKE '%search%' 
OR `name` LIKE '%search%';

首先,我想只显示form_id为3或6且发布年份为2013的帖子。同时我想在我的文本列中搜索,如果这三个中有一个匹配,但是使用OR与AND结合使用它不会按我想要的方式工作。如果我运行这个mysql,它会返回例如与form_id不匹配的帖子。

谁能告诉我他或她如何解决这个问题。

3 个答案:

答案 0 :(得分:2)

尝试这样......

SELECT * FROM `zk_posts` WHERE `form_id` IN (3,6) 
AND FROM_UNIXTIME(published, '%Y') = 2013 
AND (`message` LIKE '%search%' 
OR `description` LIKE '%search%' 
OR `name` LIKE '%search%');

答案 1 :(得分:0)

您需要使用括号来强制执行mysql评估这些条件的顺序。可能是这样的:

SELECT ...
WHERE (`form_id` in (3,6))
    AND (FROM_UNIXTIME(published, '%Y') = 2013)
    AND (
       message LIKE '%search%'
       OR description LIKE '%search%'
       OR name LIKE '%searc%'
    )

如上所述,您的查询被视为

... WHERE (everything else)
    OR (message LIKE ...)
    OR (description LIKE ...)
    OR (name LIKE ...)

如果搜索条件位于这三个字段中的任何一个中,则评估为TRUE,而不考虑其他条件。

答案 2 :(得分:0)

这是你想要的吗? (请注意OR条件下的括号

 SELECT * FROM `zk_posts` 
WHERE `form_id` IN (3,6) AND FROM_UNIXTIME(published, '%Y') = 2013 AND 
(`message` LIKE '%search%' OR `description` LIKE '%search%' OR `name` LIKE '%search%');