如何在一个选择查询中使用“order by”和“count()”
Posted
技术标签:
【中文标题】如何在一个选择查询中使用“order by”和“count()”【英文标题】:how to use "order by" and "count()" in one select query 【发布时间】: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 的查询风格吗?
任何帮助将不胜感激!
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何在一个选择查询中使用“order by”和“count()”的主要内容,如果未能解决你的问题,请参考以下文章
使用 ORDER BY 和 MATCH AGAINST 优化选择查询
在 mysql 中使用 union 和 order by 子句
使用 ORDER BY 和 INNER JOIN 优化 MySQL 查询(选择用户关注的位置)