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

时间:2013-02-06 16:22:23

标签: php mysql search

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

我需要两个查询: 更新

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

'巧克力,加那奇糖霜,草莓'

您可以搜索“类似”的蛋糕:

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

但是,如果您可以更改架构,我会这样做。搜索规范化关键字比使用LIKE

让数据库解析文本更有效,更快捷

如果您可以制作一个keywords ,它通过ID引用父表,您可以使用JOIN进行相等搜索意见。

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

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

这是未经测试的,并且使用no 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