【问题标题】:Find record that matches most keywords in database查找与数据库中大多数关键字匹配的记录
【发布时间】:2015-12-18 09:50:55
【问题描述】:

我无法在我的数据库中找到给出一些关键字的特定单词。

这是我的数据库:

我想要一个查询,它只返回这个关键字中的单词自行车:车轮踏板链。

我尝试使用此代码:

SELECT * 
FROM mydb 
WHERE keywords LIKE '%wheels%' AND keywords LIKE '%pedals%' AND keywords LIKE '%chain%'

但查询没有给出任何结果,因为 mydb 中不存在关键字“chain”。

我也试过这个其他查询:

SELECT * 
FROM mydb 
WHERE keywords LIKE '%wheels%' OR keywords LIKE '%pedals%' OR keywords LIKE '%chain%' 

查询返回所有单词(汽车、火车、自行车)。

我的范围是通过搜索定义自行车的词来尝试猜测像“自行车”这样的词,所以如果我在数据库中未列出的搜索字符串中插入一个关键字,仍然会得出结果“自行车” ”。 例如,如果我输入关键字“wheels”“pedals”和一个不包含在我的数据库中的关键字,如“chain”,它应该返回“bike”。

【问题讨论】:

    标签: php mysql database search


    【解决方案1】:

    你可以这样做。您只需要计算匹配的关键字数量,然后按该计数对表格进行排序。

    匹配如下关键字之一:(keywords LIKE '%wheels%') 将返回一个布尔值,在 MySQL 中用 1 (true) 或 0 (false) 表示。因此,只需将所有匹配的关键字加在一起,如下所示:

    (keywords LIKE '%wheels%') + (keywords LIKE '%pedals') + (keywords LIKE '%chain%')
    

    然后按总和排序。如果按降序排序并选择第一行,应该是最佳匹配。

    SELECT mydb.*, 
        ((keywords LIKE '%wheels%') + 
        (keywords LIKE '%pedals') + 
        (keywords LIKE '%chain%')) AS best_match
    FROM mydb
    ORDER BY best_match DESC
    LIMIT 1;
    

    确实,如果您有一个相关的关键字表,而不是在一列中有多个关键字,那么这个查询会更容易编写并且更快。

    【讨论】:

    • 您好,感谢您的帮助!这个解决方案似乎工作正常。如何排除所有有效 = 0 的记录?我尝试如下添加 AND 运算符但没有用: SELECT searchengine.*, ((keywords LIKE '%wheels%') ) AS best_match FROM searchengine ORDER BY best_match DESC LIMIT 1 AND valid = 1;
    • 你需要在FROM mydb之后和ORDER BY...之前添加一个WHERE子句(WHERE valid=1)。
    • 我包含了子句:SELECT searchengine.*, ((keywords LIKE '%wheels%')) AS best_match FROM searchengine WHERE valid = 1 ORDER BY best_match DESC LIMIT 1 。它有效,但如果我搜索 mydb 中未包含的关键字,则查询返回所有有效 = 1 的记录。字段有效的原因是从搜索关键字中排除有效 = 0
    【解决方案2】:

    好的,所以您的第一个查询没有返回任何内容,因为您的数据库中没有包含您指定的所有单词的记录。

    第二个查询返回所有记录,因为它们都包含“轮子”。

    尝试您的第一个查询,但不寻找“链”,它应该只返回自行车。

    【讨论】:

    • 问题是自行车应该是一些描述自行车的关键字的结果,并且在数据库中只定义了几个关键字,但是从 php 界面中您可以键入数据库中不存在的关键字。
    • 好的,所以您希望它返回最接近的匹配项?因此,如果您输入 5 个关键字,2 个匹配自行车,1 个匹配汽车,您希望它只返回自行车。对吗?
    • 您可以更改数据库的布局还是屏幕截图中的表格必须保持不变?
    • 理论上不会,但无论如何你有什么建议?
    • 嗯,这不是一个简单的问题,绝对不是一个select语句就能解决的。通过将关键字拆分到单独的表格中,您可以使事情变得更容易一些。如果您考虑解决方案中涉及的步骤,而不是试图找到一种可行的方法,您可能会取得更多进展。例如,对于每一行计算关键字匹配的数量,按计数排序,选择第一行。只是一个例子,可能不是最好的方法
    【解决方案3】:

    您可以通过此查询简单地返回自行车

    SELECT * FROM `stackoverflow` WHERE `title` LIKE '%bike%'
    

    【讨论】:

    • 嗨,这辆自行车是应该通过插入描述自行车的关键字出现的结果
    【解决方案4】:

    试试这个

    SELECT *  FROM mydb  
        WHERE keywords LIKE '%wheels%pedals%' 
    

    【讨论】:

    • 谢谢,但是如果我输入一个不包含在我的数据库中的单词,查询将不会返回结果。
    • 您的数据库中未包含的单词是什么意思? 'keywords' 的类型是什么,它是一个列表、字符串还是什么
    • 例如,“自行车”的标签是:两轮踏板,而“汽车”的标签是:电动四轮转向座椅。从网络界面插入关键字:踏板,车轮应该返回自行车。关键字是字符串。
    • 所以在界面中你必须设置两个关键字,所以它是一个字符串列表,每个元素都必须是'踏板'或轮子',就这样??
    • @issibra 请参阅下面我的答案中的 cmets 和新编辑的标题。基本上问题是在数据库中找到与输入的最多关键字匹配的记录(通过 UI)。
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多