我有一个排序/分组问题,我希望有人可以增加一些见解。
我们有一个故事表,其中包含发布日期和更新日期。我正在使用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中对它们进行组合和分组。问题是页面上的项目数量是不规则的。
所以我想我的问题是:查询表中的项目列表并根据两个字段对它们进行排序的最佳方法是什么,如果第二个字段中有值,则复制查询中的项目,以及然后根据这两个字段进行排序?
希望有道理......
答案 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