gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:06:15 29 4
gpt4 key购买 nike

我有一个名为 posts 的表,它有两列(entry_id 和 category_id)

entry_id | category_id
52 | 44
55 | 47
58 | 50
55 | 55
58 | 52
53 | 51
58 | 56
61 | 56

如何首先选择所有标记为 category_id 50 和 56(完全匹配)的条目,然后按部分匹配对其余条目进行排序 - 仅标记为 category_id = 50 的条目,下一个标记为 56 的条目等。

谢谢,

最佳答案

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

select entry_id
from posts
group by entry_id
order by max(category_id = 50) + max(category_id = 56) desc

表达式 max(category_id = 50) 返回 1 如果类别 50 在混合中(对于条目),否则返回 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

关于mysql - 完全匹配,然后是部分匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17174494/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com