mysql - 按出现次数排序查询集

标签 mysql django

我有一个 django 模型:

class Field:

choice = models.CharField(choices=choices)

value = models.CharField(max_length=255)  

在我的数据库中,有些情况下有 3 个“字段”具有相同的选择,有些情况下有 1 个字段具有相同的选择

我怎样才能对查询集进行排序,以便它返回,按选择排序,但一开始是一组 3 个?

例如

[1,1,1,3,3,3,4,4,4,2,5] 其中 1,2,3,4,5有可能的选择吗?

最佳答案

这是我使用 django 的 ORM 所能做的最好的事情。基本上,就像在 SQL 中一样,您必须构建自定义 order_by 语句。在我们的例子中,我们将 place it in the SELECT and then order by it :

1) 获取按频率排序的选项列表:[1, 3, 4, 2, 5]

freq_list = (
    Field.objects.values_list('choice', flat=True)
    .annotate(c=Count('id')).order_by('-c', 'choice')
)

2) 使用枚举添加索引:[(0,1), (1,3), (2,4), (3,2), (4,5)]

enum_list = list(enumerate(freq_list))

3) 创建案例列表:['CASE', 'WHEN choice=1 THEN 0', ..., 'END']

case_list = ['CASE']
case_list += ["WHEN choice={1} THEN {0}".format(*tup) for tup in enum_list]
case_list += ['END']

4) 将 case 列表组合成一个字符串:'CASE WHEN choice=1 THEN 0 ...'

case_statement = ' '.join(case_list)

5) 最后用case语句选择一个额外的字段'o'对应顺序,然后按这个字段排序

Field.objects.extra(select={'o': case_statement}).order_by('o')

为了简化这一切,您可以将以上代码放入模型管理器:

class FieldManager(models.Manager):
    def get_query_set(self):
        freq_list = (
            Field.objects.values_list('choice', flat=True)
            .annotate(c=Count('id')).order_by('-c', 'choice')
        )
        enum_list = list(enumerate(freq_list))
        case_list = ['CASE']
        case_list += ["WHEN choice={1} THEN {0}".format(*tup) for tup in enum_list]
        case_list += ['END']
        case_statement = ' '.join(case_list)
        ordered = Field.objects.extra(select={'o': case_statement}).order_by('o')
        return ordered

class Field(models.Model):
    ...
    freq_sorted = FieldManager()

现在可以查询:

Field.freq_sorted.all()

这将为您提供一个按选择频率排序的Field QuerySet

关于mysql - 按出现次数排序查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24305547/

相关文章:

mysql - 有什么理由仍然对数据库表和列使用 snake case 吗?

java - SQL DECIMAL 转 Java Number

django - 如何在 Django View 中使用 celery 存储延迟调用的结果?

django - 通过表单 OnetoOneField 更新 - 重复的键值违反唯一约束

python - django 创建多种类型用户的最佳方法

python - 为 django 项目设置 PYTHONPATH 的正确方法

MySQL inner join 从同一张表中排序父子孙

php - 登录和注册系统出现问题。接收和错误

python - 多个 MySQL JOIN 和重复的单元格

python - Django:匹配查询不存在且 django.core.exceptions.ImproperlyConfigured