用于获取一个最大值的SQL查询

时间:2013-03-09 16:19:36

标签: android sql sqlite max

Hello stackoverflow:D

我正在构建一个带有listview的android应用程序,需要进行某种排序,因为它可以重新洗牌。所以我的数据库中有一个排序列,用于保存数据库中每个值的位置。现在,每当我在列表中创建一个新元素时,我希望它的排序值为maximum+1,因此它将位于列表的末尾。问题是,我不知道如何编写将返回一个值的原始查询,并检查它以确保检索到一个值(数据库可能为空)。

到目前为止我的努力:

Cursor sortcursor = ourDatabase.rawQuery("SELECT MAX(" + KEY_SORT + ") FROM " + TABLE_CASTING + " WHERE " + KEY_USER + "='" + username + "';", null);
int maxSort = sortcursor.getInt(sortcursor.getColumnIndex(KEY_SORT));
maxSort++;
cv.put(KEY_SORT, maxSort);

感谢您的帮助:)

2 个答案:

答案 0 :(得分:2)

在您的情况下,游标只有一列,因此您应该使用sortcursor.getInt(0)而不是sortcursor.getInt(sortcursor.getColumnIndex(KEY_SORT))。请尝试以下代码:

Cursor cursor = ourDatabase.rawQuery("SELECT MAX(" + KEY_SORT + ") FROM " + TABLE_CASTING + " WHERE " + KEY_USER + "='" + username + "';", null);
int maxSort = 0;

if (cursor != null) {
    try {
        if (cursor.moveToFirst() && !cursor.isNull(0)) {
            maxSort = cursor.getInt(0) + 1;
        }
    } finally {
        cursor.close();
    }
}

cv.put(KEY_SORT, maxSort);

答案 1 :(得分:1)

以下内容可行,但请注意它是用MYSQL而不是sqllite编写的,但我假设它们具有相同的功能。我已经完成了将下一个订单值插入表中,如果表为空则返回1,如果不是则将值递增1。第二个子查询返回顺序,但我发现将它与插入结合起来很方便。

INSERT INTO table_name (order_column_name) 
VALUES ( 
    (SELECT CASE WHEN MAX(tn.order_column_name) IS NULL THEN 1 
     ELSE MAX(tn.order_column_name)+1 END
     AS order_column_name FROM table_name tn
     ORDER BY tn.order_column_name DESC LIMIT 1)
);