1

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

我需要两个查询:已更新

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

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

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

4

1 回答 1

1

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

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

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

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

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

不过,如果您可以更改架构,我会这样做。搜索规范化的关键字将比使用 DB 通过文本解析更有效和更快LIKE

如果您可以创建一个通过 ID 引用父表的keywords table,那么您可以使用 a 进行相等搜索JOIN,这在我看来会更好。

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

编辑:所以根据你的更新,你有一个cakewords可以搜索的表。

这是未经测试的,并且可能有一种更有效的方式使用 noIN子句。但想法是您知道特定蛋糕的所有关键字 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:这是一个很好的相关问题:

标签/关键字匹配的最佳解决方案是什么?

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

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
于 2013-02-06T16:29:28.907 回答