具有多个条件但结果有限的MySQL查询

时间:2018-01-02 00:33:55

标签: php mysql

我有一个PHP脚本,可以从MySQL数据库创建RSS源。 数据库中的记录涵盖三年。

我一直在改变MySQL查询,并在此处搜索以解决问题 然后至少现在有结果返回,但它只带回来 几个月的结果,不管我为查询中的记录数设置的限制。

以下是查询:

$mysqli->query("
SELECT * 
  FROM news 
 WHERE (`title` LIKE '%red%' 
      OR `title` LIKE '%green%' 
      OR `title` LIKE '%blue%' 
      OR `title` LIKE '%yellow%' 
      OR `title` LIKE '%black%') 
   AND published = 1
   AND category_id != 9
   AND category_id != 10
 ORDER 
    BY id DESC LIMIT $news_number")

$ news_number设置为200,但我已尝试使用更高的数字,结果数量不会改变。

作为一个例子,如果我运行上面的查询,我得到了一些结果但是 低于极限,并在11月初停止说。

但是,如果我只使用一个术语(即蓝色)进行LIKE搜索,那么它会在一年内带回更多结果。

我的问题是MySQL查询看起来是否正确 - 尝试过很多东西但是 尽管花了相当多的时间,但似乎无法做到这一点。

提前致谢

增加:

因此,为了澄清我是否将此查询作为示例运行,我会返回200个结果:

$mysqli->query("SELECT * FROM news WHERE `title` LIKE '%red%' AND
    published='1' AND category_id !='9' AND category_id !='10'
    ORDER BY id DESC LIMIT $news_number")

但如果我用OR中包含的红色运行此查询,那么我得到35个结果:

$mysqli->query("SELECT * FROM news WHERE (`title` LIKE '%red%' OR `title` LIKE '%green%' OR
    `title` LIKE '%blue%' OR `title` LIKE '%yellow%' OR `title` LIKE '%black%') AND
    published='1' AND category_id !='9' AND category_id !='10'
    ORDER BY id DESC LIMIT $news_number")

在第二个我期望得到超过200个结果,除非 代码错了?

感谢那些提出建议 - 已在下面更新了结果:

为了测试flynorc所提到的,我改变了查询,所以它读起来像这样:

("SELECT * FROM news WHERE title REGEXP 'red|green|blue|yellow|black' AND published='1' AND category_id !='9' AND category_id !='10' ORDER BY id DESC  LIMIT $news_number")

结果是它返回了与我的相同数量的结果(上面的原始第一个),并且返回的结果从11月开始停止。

所以我删除了LIMIT $ news_number,结果数没有改变。

然后我再次将查询更改为如下所示:

("SELECT * FROM news WHERE title REGEXP 'red|green' AND published='1' AND category_id !='9' AND category_id !='10' ORDER BY id DESC")

随着今年3月份的记录停止,它带来了更多的结果 - 但仍然不是整个数据库,因为它有三年的记录。

要澄清标题字段 - 这包含具有我想要匹配的完整单词的标题,并且有许多标题应该匹配。我的意思是我不是在寻找像红色这样的单词我只是想用红色这样的单词来匹配

道歉,如果我的解释不是很好 - 这让我很困惑。在这个阶段,我可以看到获得更多结果的唯一方法是运行两个脚本,查询分解为更短的。

1 个答案:

答案 0 :(得分:1)

您的查询中的问题是曲线括号,您还需要在其他查询中为LIKE条件添加它们。

下面两个查询看起来相似,但看起来很接近我为其中一个添加了弯曲的大括号(),因为这样他们会产生不同的输出。第二个是正确的。

因此,在使用LIKE条件将它们与sql查询中的其他条件隔离时,我们需要使用弯曲括号。

SELECT * FROM test WHERE str LIKE '%red%' OR  str LIKE '%green%' OR str LIKE '%blue%' OR str LIKE '%yellow%' OR str LIKE '%black%' AND id=1;


SELECT * FROM test WHERE (str LIKE '%red%' OR  str LIKE '%green%' OR str LIKE '%blue%' OR str LIKE '%yellow%' OR str LIKE '%black%') AND id=1;

sql fiddle :: http://sqlfiddle.com/#!9/d262b8/2

希望这有帮助。