【问题标题】:how to use "order by" and "count()" in one select query如何在一个选择查询中使用“order by”和“count()”
【发布时间】:2013-06-27 02:25:57
【问题描述】:

在android的mediastore数据库中有一个名为images的表,images表中有一个timetaken列,表示图片的创建时间,单位为毫秒。

现在我有一个需求,我想按创建日期(而不是时间)对图像进行分组,并计算每天的图像,所以我尝试了这个查询:

SELECT datetaken/86400000*86400000 as dateT, count(dateT) as imageSumInDate 来自图像 哪里 (1 = 1) 按(日期T)分组 ORDER BY dateT DESC

不幸的是,它出现了错误:

android.database.sqlite.SQLiteException:没有这样的列:dateT(代码1)

然后我问别人这个问题,他给出如下子查询样式:

选择 dateT,COUNT(dateT) 作为 imageSumInDate 从(SELECT datetaken/86400000*86400000 as dateT FROM images)t 哪里 (1 = 1) 按(日期T)分组 ORDER BY dateT DESC

这可能是正确的,但我不能在 ContentResolver 的查询方法中使用这个子查询。 ContentResolver 可能只支持这种风格的查询:

从____订购的表中选择____

有什么技巧可以帮助我适应 ContentResolver 的查询风格吗?

任何帮助将不胜感激!

【问题讨论】:

    标签: android count android-contentresolver mediastore


    【解决方案1】:

    试试这个:

    SELECT datetaken/86400000*86400000 as dateT, count(datetaken) as imageSumInDate FROM images WHERE (1 = 1 ) GROUP BY (datetaken/86400000*86400000) ORDER BY datetaken/86400000*86400000 DESC
    

    问题是dateT 列别名在ORDER BY 子句的范围内无效。只需重复 dateT 表达式而不是使用 dateT 别名即可解决问题。

    编辑:从查询中删除了对dateT 列别名的所有引用。 (很明显,我应该这样做才能开始。:)

    【讨论】:

    • 感谢您的回答,但仍然出现相同的错误:没有这样的列:dateT,似乎dateT列别名在count函数范围内无效。如果我删除“ count(dateT) as imageSumInDate",会正确执行
    • 啊。问题在于count() 表达式或group by 子句,而不是(仅)order by。我已经更新了我的答案;请尝试一下。
    • 我已经尝试了你所有的三个答案,都出现了同样的错误。如果我删除“count(dateT) as imageSumInDate”,并使用“SELECT datetaken/86400000*86400000 as dateT FROM images WHERE (1 = 1 ) group by (dateT) ORDER BY dateT DESC",它会正确运行。看来"count()"的范围有一些问题。
    • 当前在我的答案中的查询 -- SELECT datetaken/86400000*86400000 as dateT, count(datetaken) as imageSumInDate FROM images WHERE (1 = 1) GROUP BY (datetaken/86400000*86400000) ORDER BY datetaken/86400000*86400000 DESC -- 真的不应该引发关于 dateT 的任何错误,因为它在查询中的任何地方都没有引用 dateT(除了定义它,明显地)。您确定执行该查询会引发关于 dateT 的错误吗?
    • 是的,我确定。logcat 只是说:06-27 11:10:16.480: W/System.err(13417): android.database.sqlite.SQLiteException: no such列:dateT(代码 1):,编译时:SELECT datetaken/86400000*86400000 as dateT,count(dateT) as imageSumInDate FROM images WHERE (1 = 1) group by (datetaken/86400000*86400000) ORDER BY datetaken/86400000* 86400000 DESC
    【解决方案2】:

    也可以通过适合 ContentResolver 的查询风格的技巧来解决:

    选择 dateT,COUNT(dateT) as imageSumInDate from (SELECT datetaken/86400000*86400000 as dateT FROM images where (1=1))t 按(日期T)分组 ORDER BY dateT DESC

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多