如何在一个选择查询中使用“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 子句

SQL如何使用order by语句查询数据表的多字段

使用 ORDER BY 和 INNER JOIN 优化 MySQL 查询(选择用户关注的位置)

在 sql 查询中使用 LIMIT 和 ORDER BY 和 LEFT JOIN

mysql 通过查询从 order by 中选择平均值