让我们看看是否有人能帮我。。。在产品页面上,我必须展示相关产品。这些产品的关联取决于它们的标签。例如,我的产品(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