mysql 部分匹配_mysql-完全匹配,然后部分匹配

您需要按输入汇总数据,然后应用订单条件:

select entry_id

from posts

group by entry_id

order by max(category_id = 50) + max(category_id = 56) desc

如果类别50(在条目中)在混合中,则表达式max(category_id = 50)返回1,否则返回0.通过将这两个表达式加在一起,可以获得类别匹配的数量.

如果您关心单例匹配的顺序(如问题所建议),请执行以下操作:

select entry_id

from posts

group by entry_id

order by max(category_id = 50) + max(category_id = 56) desc,

max(category_id = 50) desc,

max(category_id = 56) desc

编辑:

如果将可用类别存储在以逗号分隔的列表中,那么您将拥有世界上最好的.您可以按匹配的类别数(第一个)排序.然后,您可以使用该列表确定类别的优先级.并且,您可以确保具有相同类别集的所有实体一起出现.它只需要字符串操作.

表达方式:

count(distinct (case when find_in_set(category_id, @categories) > 0 then category_id end))

将计算列表中的类别数量(对于一个实体).

表达方式:

group_concat((case when find_in_set(category_id, @categories) > 0

then find_in_set(category_id, @categories)

end)

将创建一个字符串,其中的元素表示字符串中的位置.因此,如果您输入’a,b,c;并且实体匹配“ b”和“ c”,则字符串将为“ 2,3”.如果所有三个都为,则为“ 1,2,3”.这提供了确定优先级所需的条件.

最后,在最后添加entity_id使排序稳定:

order by count(distinct (case when find_in_set(category_id, @categories) > 0 then category_id end)) desc,

group_concat((case when find_in_set(category_id, @categories) > 0

then find_in_set(category_id, @categories)

end)

order by find_in_set(category_id, @categories)),

entry_id

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值