【问题标题】:How to combine these three sql queries into one?如何将这三个 sql 查询合二为一?
【发布时间】:2023-03-21 08:06:01
【问题描述】:

如何将这两个sql查询合二为一?

SELECT DISTINCT * FROM rss WHERE MATCH(content,title) AGAINST ('$filter') 

SELECT COUNT(content) FROM rss WHERE MATCH(content,title) AGAINST ('$filters')

如果上述查询的结果为 0

-

SELECT DISTINCT * FROM rss WHERE content LIKE '%$filters%' OR title LIKE '%$filters%'; 
$filter .= $row['filter'];
$filters = $row['filter'];

$filters 可能有多个关键字

【问题讨论】:

  • 因为 match...against 更准确,但搜索常用词时不返回任何内容

标签: php mysql full-text-search


【解决方案1】:

您不必使用查询 2,

mysql_num_rows 将指示查询 1 有多少行,因此只需丢弃查询 2

如果mysql_num_rows 返回零,则继续查询 3

要将三个查询合二为一,请使用OR

SELECT DISTINCT * FROM rss 
WHERE 
  (MATCH(content,title) AGAINST ('$filter'))
OR
  (content LIKE '%$filter%' OR title LIKE '%$filter%')

如上所述,您实际上并不需要先进行计数。

如果$filter包含很多关键字,那么就重复like

  (content LIKE '%$filter_1%' OR title LIKE '%$filter_1%') OR
  (content LIKE '%$filter_2%' OR title LIKE '%$filter_2%') OR ...

【讨论】:

  • 是的,我这样做了,它再次返回我重复的结果?
  • 您的数据是否包含重复记录,,您的输出方法错误。您应该将您的问题更新为您的表架构、您认为重复的示例数据,当然还有您的完整代码(不是全部,而是执行此操作的部分)
  • 很好的解决方案,当您只有一个数据集时,对同一个表的 2 次查询只是meninsløst。 +1。如果你有索引,我可能会添加一个没有 OR 的解决方案,因为执行计划。
【解决方案2】:

您可以使用UNION ALL 组合 1 和 3。但是您不能将 2nd 与其他 2 合并,因为 COUNT 返回一堆行的聚合。

您最好在您的情况下编写一个存储过程,而不是尝试将所有三个内容都放入一个语句中。

编辑(通过 sv88erik):由于您使用的是 UNION ALL,因此您不需要在每个查询中使用 DISTINCT 关键字。

【讨论】:

  • UNION ALL,那么你不需要有 DISTINCT
猜你喜欢
  • 1970-01-01
  • 2016-11-18
  • 2018-04-14
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多