繁体   English   中英

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

[英]MySQL Query with multiple conditions but limited results

我有一个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月停止,它带来了更多的结果-尽管它的记录可以追溯到3年,但仍然不是整个数据库。

为了澄清标题字段-其中包含具有我要匹配的完整单词的标题,并且有很多标题应匹配。 我的意思是我不是真的在寻找带红色的词,我只是想将其与红色的词匹配

抱歉,如果我的解释不出色-这让我感到非常困惑。 在此阶段,我可以看到获得更多结果的唯一方法是运行两个脚本,并将查询分解为较短的脚本。

查询中的问题是弯括号,您还需要在其他查询中为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小提琴:: http://sqlfiddle.com/#!9/d262b8/2

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM