0

我试图弄清楚要使用哪个 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 in与 AND 组合它不能按我想要的方式工作。如果我运行这个 mysql,它会返回例如与 form_id 不匹配的帖子。

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

4

3 回答 3

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%');
于 2013-05-08T21:51:41.420 回答
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。

于 2013-05-08T21:51:08.497 回答
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%');
于 2013-05-08T21:51:23.423 回答