我有一个名为cake的表,其中包含列:id,title,description,keywords。我还有一个名为keywords的表,其中cake是父项。关键字表包含两列:id和关键字
我需要两个查询: 更新
如果一个人输入巧克力,榛子,草莓等成分(可以用逗号分隔),我需要查询来搜索包含所有三个关键字并显示结果的蛋糕。仅显示包含所有三种蛋糕的蛋糕。如果没有蛋糕匹配,我需要一条消息说没有找到。
我在搜索框上有一个标签,上面写着,找到类似的蛋糕。如果某人输入Vanilla Raspberry或示例,则查询需要在数据库中找到蛋糕并将其关键字与其他蛋糕的关键字匹配并显示结果。仅显示具有相同关键字的蛋糕。
不确定如何编写这些查询。任何帮助表示赞赏。谢谢!
答案 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