草庐IT

php - mySql - 基于关键字的搜索查询

coder 2023-10-26 原文

我找不到任何真正帮助我解决这个问题的东西。 我有一个具有以下结构的数据库:

和一个简单的查询来搜索和显示来自数据库的一些结果:

if ($_REQUEST['search']) {
    $q = $_REQUEST['search'];
    $q_comma = explode(", ", $q);
    $where_in_set = '';
    $count = count($q_comma);

    foreach ($q_comma as $q) {
        $counter++;
        if ($counter == $count) {
            $where_in_set .= "FIND_IN_SET('$q','keywords')";
        } else {
            $where_in_set .= "FIND_IN_SET('$q','keywords') AND ";
        }
    }


    $sql_res = "select link, description, keyword from myDB where $where_in_set or description like '%$q%'";

此代码有效,但并非如我所愿。

在关键字列中,我有不同的逗号分隔关键字,我希望即使顺序不同也能搜索到它们。

举个例子:假设我有一个关键字列

Google, Facebook, twitter

使用我当前的代码,如果我输入 Google,我可以看到结果,但如果我输入 twitter,我看不到它。

我可以做些什么来让它在不考虑关键字顺序的情况下工作,但搜索速度也非常快?

任何帮助将不胜感激。

附言。如果可能的话,我想只保留一个数据库,因为我读到过关于创建一个只有 ID 和关键字的新表,并且在我的搜索中加入了 ID 上的表,但如果可能的话我更喜欢更好的解决方案。

谢谢

编辑

一些更新:

  1. 正如@Frayne Konok 所指出的,我的查询是小写的,数据库中的所有值也是小写的,所以大小写不是问题
  2. 按照@mkaatman 的建议,我将 keyword 列用反引号 (`) 包裹起来
  3. 我更改了我的查询,现在它看起来像@user2272989 在答案中建议的那个

所以我的查询现在看起来像这样:

select link, description, keyword from myDB
where (FIND_IN_SET('google',`keyword`) or
       FIND_IN_SET('facebook', `keyword`) or 
       FIND_IN_SET('twitter', `keyword`))
       OR description like 'google, facebook, twitter'

即使顺序不同,它也会返回值,但它不会只显示我想要的那个。 例如,如果我写 twitter、google、facebook,我有 28 行的返回值,其中只有 2 行将所有三个词作为关键字,而另一个只有一两个词

编辑 2 - 更新

我只是想“重新打开”这个问题,因为我没能解决这个问题。如果我将所有关键字都更改为一个对象,那么将它们用作关键字会更好吗?或者在数据库中搜索关键字的绝对最佳和更可靠的方法是什么?拥有不同的数据库并使用 INNER JOIN?

此时,如果有帮助,我愿意更改结构和代码。

谢谢

最佳答案

这可能对你有帮助

$sql_res = "select link, description, keyword from myDB 
      where (FIND_IN_SET('yahoo',keyword) or
             FIND_IN_SET('twitter',keyword)) or 
             description like '%$q%'";

您正在 FIND_IN_SET 中使用 AND 条件

关于php - mySql - 基于关键字的搜索查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35873107/

有关php - mySql - 基于关键字的搜索查询的更多相关文章

  1. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

    我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

  2. ruby-on-rails - 在 Rails 和 ActiveRecord 中查询时忽略某些字段 - 2

    我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr

  3. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  4. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  5. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  8. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  9. ruby - Ruby 的 AST 中的 'send' 关键字是什么意思? - 2

    我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的

  10. ruby - 如何搜索有用的 ruby - 2

    寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是ruby​​gems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和ruby​​gems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko

随机推荐