【问题标题】:Fetch data order by whole numbers instead of order by each digit of a number按整数而不是按数字的每个数字顺序获取数据
【发布时间】:2014-01-25 11:39:09
【问题描述】:

当我在 mysql 查询中使用 ORDER BY 时,它是按数字的每个数字排序的。

例如:在我的查询中使用正常的 ORDER BY 我得到了这个结果

101, 103, 104, 105, 12, 123, 125, 13, 131, 134

但我的要求是我应该得到这样的结果:

12, 13, 101, 103, 104, 105, 123, 125, 131, 134

我们如何在mysql查询中做到这一点。

Django 查询示例:

Foo.objects.filter(                                 
    Q(m_number__icontains=(request.GET['term']))
).filter(
    co_id = co_id,
    is_active=1
).values(
    'pk',
    'm_name',
    'm_number'
).order_by(
     'm_number'
)

我如何在这里使用额外的? order by 应该适用于 m_number 列。

【问题讨论】:

标签: python mysql django django-queryset


【解决方案1】:

您的数据很可能以文本而非数字的形式存储。如果您想强制执行正确的顺序,可以使用... ORDER BY CAST(the_column AS UNSIGNED)。但更好的解决方案很可能只是转换列本身的类型。

【讨论】:

  • 我们可以在 django 查询中进行吗?抱歉,我无法编辑列结构,因为它是旧的,我需要在很多地方进行更改。
【解决方案2】:

我同意 viraptor 的回答。

我假设你可以在 Django 中使用额外的:

Foo.objects.extra(select={ 'd_field' : 'cast(the_column AS UNSIGNED)' }).extra(order_by=['d_field'])

但 viraptor 是对的,最好转换列本身的类型(否则在使用模型时您必须记住相同的“hack”)

最后的子句应该是这样的:

Foo.objects.filter( 
    Q(m_number__icontains=(request.GET['term'])) 
).filter( 
    co_id = co_id, 
    is_active=1 
).extra( 
    select={ 
        'int_m_number': 'cast(m_number AS UNSIGNED)', 
        'pk': 'pk' , 
        'm_number': 'm_number'
    } 
).extra( 
    order_by=['int_m_number'] 
)

【讨论】:

  • 嗨,Raphel,感谢您的回复。请检查我的问题。现在我已经添加了我的代码,并在下面问了一个问题。
  • 将 .order_by('m_number') 替换为 : .extra(select={ 'int_m_number' : 'cast(m_number AS UNSIGNED)'}).extra(order_by=['int_m_number'])
  • 现在它的播种错误“无法将关键字'int_m_number'解析为字段”
  • 嗯,尝试删除 .values([...]) 子句,使最终查询看起来像: Foo.objects.filter( Q(m_number__icontains=(request.GET['term']) ) ).filter( co_id = co_id, is_active=1 ).extra( select={ 'int_m_number' : 'cast(m_number AS UNSIGNED)'} ).extra( order_by=['int_m_number'] )
  • 如果你真的想真正限制在一小部分领域(这是个好主意),你可以在额外/选择中定义它们: .extra( select={ 'int_m_number' : 'cast(m_number AS UNSIGNED)', 'pk':'pk', 'm_name':'m_name', 'm_number':'m_number'})
猜你喜欢
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 2022-12-18
  • 2020-02-16
  • 1970-01-01
  • 2019-05-16
相关资源
最近更新 更多