我有一个名为 cakes 的表,其中包含以下列:id、title、description、keywords。我还有一个名为 keywords 的表,cakes 是父表。 keywords 表包含两列:id 和 keyword
我需要两个查询:UPDATED
如果有人输入巧克力、榛子、草莓等成分(可以是用逗号分隔的任何内容),我需要查询来搜索包含所有三个关键字的蛋糕并显示结果。仅显示包含所有三个的蛋糕。如果没有蛋糕匹配,我需要一条消息说没有找到。
我在搜索框上有一个标签,上面写着“查找相似的蛋糕”。如果一个人输入 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/