【问题标题】:MSQL query for displaying results based on the same keywords基于相同关键字显示结果的 SQL 查询
【发布时间】:2013-02-06 16:22:22
【问题描述】:

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

我需要两个查询:已更新

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

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

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

【问题讨论】:

  • 如果它们相似,你会怎么做?你能以表格形式给出样本记录吗?还有你想要的结果。
  • “关键字”是一个由分隔字符串组成的长文本字段吗?你有能力改变这个架构吗?
  • Matthew- 用逗号分隔的长文本字段。示例:坚果、花生酱、巧克力我真的不想更改架构 - 我有几个搜索查询效果很好,但没有一个显示基于关键字匹配的结果
  • 更改架构。或者不要为此使用 RDBMS。这可能看起来很苛刻,但实际上就是这么简单。

标签: php mysql search


【解决方案1】:

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

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

'巧克力、甘纳许、草莓'

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

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

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

解析文本更加高效和快速

如果您可以创建一个 keywords ,它通过 ID 引用父表,那么您可以使用 JOIN 进行相等搜索,我认为这会更好。 p>

它可能有三列: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

【讨论】:

  • 我有一个关键字表-让我更新代码以便您查看。
  • Matthew- 关于您的第一个选项,我是否需要在一个长查询中使用列出所有关键字?我有数百个关键字。
  • @user1913714 你没有,因为你有一个关键字表。如果它们都在一个列中,那么您可能必须这样做。您的原始描述说您有一个包含所有关键字的。事实上,你有一个table
  • 这听起来很荒谬,但不确定 cs 和 csw 是什么意思?
  • @user1913714 这些是表的别名。 w3schools.com/sql/sql_alias.asp
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
相关资源
最近更新 更多