[英]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.