php - 基于相同关键字显示结果的 SQL 查询

标签 php mysql search

我有一个名为 cakes 的表,其中包含以下列:id、title、description、keywords。我还有一个名为 keywords 的表,cakes 是父表。 keywords 表包含两列:id 和 keyword

我需要两个查询:UPDATED

  1. 如果有人输入巧克力、榛子、草莓等成分(可以是用逗号分隔的任何内容),我需要查询来搜索包含所有三个关键字的蛋糕并显示结果。仅显示包含所有三个的蛋糕。如果没有蛋糕匹配,我需要一条消息说没有找到。

  2. 我在搜索框上有一个标签,上面写着“查找相似的蛋糕”。如果一个人输入 Vanilla Raspberry 或 example,查询需要在数据库中定位蛋糕并将其关键字与其他蛋糕的关键字匹配并显示结果。仅显示具有相同关键字的蛋糕。

不确定如何编写这些查询。任何帮助表示赞赏。谢谢!

最佳答案

如果数据库必须为“关键字”使用分隔的长字符串字段而不是将它们放在行中,那么您将需要使用 LIKE Operator

假设您的 [keywords] 列的格式如下:

'巧克力,甘那许,草莓'

您可以像这样搜索“相似”的蛋糕:

SELECT
    columns
FROM
    table t
WHERE
    t.[keywords] LIKE '%chocolate%'
    OR t.[keywords] LIKE '%cheesecake%'

不过,如果您可以更改架构,我会这样做。搜索规范化关键字 rows 将比让数据库使用 LIKE

解析文本更加高效和快速

如果您可以制作一个keywords ,它通过 ID 引用父表,您可以使用 JOIN 进行相等搜索在我看来会更好。

它可能有三列:Id、ParentId、Keyword

编辑:因此,根据您的更新,您有一个可以搜索的 cakewords 表。

这是未经测试的,可能有一种不使用 IN 子句的更有效的方法。但想法是您知道特定蛋糕的所有关键字 ID。然后,您正在寻找该集合中包含关键字的其他蛋糕。

SELECT
    columns
FROM
    cake AS cs
JOIN
    cakewords AS csw
        ON csw.[cakeid] = cs.[id]
WHERE
    csw.[wordid] IN
        (SELECT
            cw.[wordid]
        FROM
            cakewords AS cw
        JOIN
            cakes AS c
                ON c.[id] = cw.[cakeid]
        WHERE
            c.[id] = @pMyCurrenctCakeId
        (

EDIT2:这是一个很好的相关问题:

What's the optimal solution for tag/keyword matching?

根据里面的答案,你可以试试这个:

SELECT DISTINCT
    c.[id]
FROM
    cakewords AS cw1
INNER JOIN cakewords cw2 
    ON cw2.[wordid] = cw1.[wordid]
INNER JOIN cake AS c 
    ON c.[id] = cw.[cakeid]
WHERE
    cw1.[cakeid] = @current_cake_id

关于php - 基于相同关键字显示结果的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14733820/

相关文章:

php - 为什么 .post jquery 函数在我的代码中不起作用?

php - 检查数据库中是否存在经纬度

java - 在找到解决方案之前 BFS 队列为空

PHP:加载相似的结果

Javascript - 为数千个单词搜索数千个文本的最有效方法?

javascript - 弹出带有来自 php 文件的消息的框

php - 我应该在我的网站上使用 "LOGINS" session 吗?

php - 使用 PHP 数组中的值

mysql - 外键可能来自不同表的数据库设计

php - 将 WHERE 和 GROUP BY 合并到日期时间总和 MySQL 查询中