SQL查询查找共享相同标记的行



让我们看看是否有人能帮我。。。在产品页面上,我必须展示相关产品。这些产品的关联取决于它们的标签。例如,我的产品(ID 23(有以下标签:烹饪、面条、健康。

我要做的是一个SQL查询,它搜索带有标签"的产品;烹饪,面条,健康;但单独

首先搜索所有具有";烹饪";在它们的标签中,然后寻找具有";面条",最后";健康";。

展示的产品必须按顺序:首先展示所有具有";烹饪";在标签列中;面条";最后";健康";。重要的是,产品不必重复。

这是我希望得到的订单:ID:25,25,40,43,46

这是数据库

面条热白胡椒面条皂胡萝卜面条番茄酱新面条加糖的苹果含糖香蕉
ID 标签 名称
23 烹饪,面条,健康
25 烹饪、面条、健康
35 烹饪、面条、健康
40 食物、面条、番茄酱
43 苹果,烹饪,健康
46 香蕉,烹饪,健康

存储数据的方式会使情况变得不必要地不理想。您不应该在一列中存储多个字符串;相反,应该有另一个表来存储产品和标签之间的关系,每个元组应该在一个单独的行上。

对于您当前的设计,您可以:

select t.*
from mytable t
where 
',' || tags || ',' like '%,cooking,%'
or ',' || tags || ',' like '%,noodles,%'
or ',' || tags || ',' like '%,healthy,%'
order by 
case
when ',' || tags || ',' like '%,cooking,%' then 1
when ',' || tags || ',' like '%,noddles,%' then 2
else 3
end,
id

这使用了标准的字符串串联运算符||:您可能需要根据实际数据库进行调整。

有些数据库具有搜索CSV列表的内置功能。例如,如果您正在运行MySQL:

select t.*
from mytable t
where 
find_in_set('cooking', tags)
or find_in_set('noodles', tags)
or find_in_set('healthy', tags)
order by 
case
when find_in_set('cooking', tags) then 1
when find_in_set('noodles', tags) then 2
else 3
end,
id

相关内容

  • 没有找到相关文章

最新更新