如何使用两个字段进行排序?

时间:2011-01-20 22:58:51

标签: python sql django sorting group-by

我有一个排序/分组问题,我希望有人可以增加一些见解。

我们有一个故事表,其中包含发布日期和更新日期。我正在使用Django所以看起来像这样:

class Story(models.Model):
    pub_date = models.DateTimeField(db_index=True)
    update_date = models.DateTimeField(blank=True, null=True, db_index=True)
    headline = models.CharField(max_length=200)
    ...

我们希望在按天分组的分页页面上显示故事。所以......

Jan 20
    Story 1
    Story 2

Jan 19
    Story 1
    Story 3

挑战在于,如果故事有update_date,它应该显示两次,一次在pub_date日,一次在update_day日期(例如,故事1)。

有成千上万的故事,所以当然我无法在python中完成所有这些故事,但我不知道在SQL中进行此查询的方法。

我现在所拥有的是通过-pub_date对所有内容进行排序,然后在给定页面上获取最大和最小日期范围。然后,我使用update_date查询这些日期之间的任何故事,并在python中对它们进行组合和分组。问题是页面上的项目数量是不规则的。

所以我想我的问题是:查询表中的项目列表并根据两个字段对它们进行排序的最佳方法是什么,如果第二个字段中有值,则复制查询中的项目,以及然后根据这两个字段进行排序?

希望有道理......

3 个答案:

答案 0 :(得分:3)

我只能想到“联盟”能够做到这一点。

这是一个看起来像什么的例子。不确定数据库通常是D:

经常发送这种类型的查询有多快或多好

该查询假设您的表格名称为故事,并使用标题 pub_date update_date 列。它还假定一个尚未更新的故事在update_date列中的值为null。

SELECT      headline,
            the_date,
            DAY(the_date) AS the_day
FROM (
    SELECT      headline,
                pub_date AS the_date
    FROM        stories
    UNION
    SELECT      headline,
                update_date AS the_date
    FROM        stories
    WHERE       update_date IS NOT NULL
) AS publishedandupdated
ORDER BY    the_date DESC;

如果要为查询添加限制,则应在“order by”子句之后的最后一次完成。

答案 1 :(得分:0)

你的问题与我的问题类似。我从Facebook墙上看了一些项目。我有两个日期,一个关于项目创建(用户发布项目),一个关于项目检索(我从Facebook读取项目)。我想显示今天发布或检索的项目。

SELECT link,time FROM homeWallItems WHERE 
DATE_SUB(CURDATE(),INTERVAL 1 DAY)<= created 
OR
DATE_SUB(CURDATE(),INTERVAL 1 DAY)<= time
group by time LIMIT 0,30
编辑:我对这句话过于乐观:这是错误的。

  

在此代码中,而不是CURDATE(),   如果您使用time,那么它应该有效   你。

答案 2 :(得分:0)

对列名做一些假设,你需要UNION ALL 来保留两个部分的重复。

    select headline, actualdate=pub_date
    from story
    where pub_date between /mindate/ and /maxdate/
union all
    select headline, actualdate=update_date
    from story
    where update_date between /mindate/ and /maxdate/
order by actualdate
  • 虚拟字段actualdate用于将pub_date / update_date匹配为ORDER BY的单个列。
  • 联合编辑语句中的ORDER BY在联合完成后应用,因此只需要出现一次。
  • 日期范围内的过滤器应用 联合的每个部分,以减少工作台大小(在应用过滤器之前不必不必要地提取所有数据)