当前位置: 首页 > 知识库问答 >
问题:

Android/SQLite-跨多个列的不同计数

纪正德
2023-03-14

我有以下代码。。。

protected long getNumQueuedChunks(boolean distinctEntries) throws Exception {

SQLiteDatabase db = null;
try {

    db = dbhelper.getReadableDatabase();

    String whereClause = C_STATUS + " = ? AND " + C_NUM_FAILURES + " < ?";
    String[] whereArgs = new String[] {STATUS_AWAITING_PROCESSING, 10};

    long count = DatabaseUtils.queryNumEntries(db, QUEUE_TABLE_NAME, whereClause, whereArgs);           
    return count;
}
finally {
    try {
        db.close();
    }
    catch(Exception ignore) {
    }
}

}

...如果我想返回与WHERE条件匹配的行的总数,这样做很好。

但是,我只想计算这3列中具有不同/唯一数据组合的记录:C_URI、C_BYTE_START_NUM和C_NUM_BYTES。

我知道我可以做一些像。。。

    String[] columns = {C_URI, C_BYTE_START_NUM, C_NUM_BYTES};
String whereClause = C_STATUS + " = ? AND " + C_NUM_FAILURES + " < ?";
String[] whereArgs = new String[] {STATUS_AWAITING_PROCESSING, "10"};
Cursor c = db.query(true, QUEUE_TABLE_NAME, columns, whereClause, whereArgs, null, null, null, null);
int count = c.getCount();

...但是我希望在这种情况下有更有效的方法来执行不同的计数??

为了增加清晰度,如果我的表中有这些数据…

C_URI |C_BYTE_START_NUM |C_NUM_BYTES

1.jpg|0|1024

1.jpg | 1024 | 1999

2.jpg|0|500

2.jpg|0|500

...非重复计数的结果应为 3。

注意:我已经看到了这里描述的类似要求(第二个答案),但这对我没有帮助,因为我想对3列而不是一列进行不同的计数。

共有2个答案

薛朝
2023-03-14

您试过SQLiteDatabase.rawQuery()方法吗?您可以在其中放入原始SQL查询,例如:

select distinct C_URI, C_BYTE_START_NUM, C_NUM_BYTES from MyTable 

该方法返回一个光标,您可以立即从光标对象中获取计数。当然,如果您愿意,您也可以指定位置子句。然后在获得计数后释放光标。

夔建章
2023-03-14

计算记录的最有效方法是让数据库执行此操作:

SELECT COUNT(*)
FROM (SELECT DISTINCT Uri,
                      ByteStartNum,
                      NumBytes
      FROM QueueTable)

(对于单独的子查询,在三个列上使用DISTINCT或GROUP BY并不重要。)

此查询不符合帮助函数(如queryqueryNumEntries)的约束,因此必须手动构造整个SQL语句:

long getNumQueuedChunks() {
    SQLiteDatabase db = dbhelper.getReadableDatabase();
    try {
        String query = "SELECT COUNT(*) FROM " +
                        "(SELECT DISTINCT " + C_URI + "," + C_BYTE_START_NUM + "," + C_NUM_BYTES +
                        " FROM " + QUEUE_TABLE_NAME +
                        " WHERE " + C_STATUS + " = ?" +
                        " AND " + C_NUM_FAILURES + " < 10)";
        String[] args = new String[] { STATUS_AWAITING_PROCESSING };
        return DatabaseUtils.longForQuery(db, query, args);
    } finally {
        db.close();
    }
}
 类似资料:
  • 问题内容: 我试图弄清楚如何编写一个查询多个列中的值的查询,结果表在每个列中对 任何 列的每个可能值都有一个计数。 示例:说我有 mytable 我想要一个查询,在每列中计算a和b,产生类似以下内容的结果: 我知道我可以通过 group by 轻松地对单个列执行此操作: 但是是否可以对 每一 列都执行此操作? 我正在使用SQL Server 2008(T-SQL)。在此先感谢您的帮助! 问题答案:

  • 问题内容: 基本上,我一直在尝试执行此操作(基于两列的计数不同): 一直在搜寻如何执行此操作,但是没有运气。尝试过此方法,但从未真正起作用。根据两个表的两个属性,这并没有明显的不同: 问题答案: 好的,这将采取一些步骤,请多多包涵。我在这里假设使用SQL Server,但说明应适用于支持1的任何方言: 创建支持该功能的自定义方言: { public MyCustomDialect() { Regi

  • 我会跟踪哪些人登录到我们的本地服务器,如下面的数据库所示。 我的数据库结构是:

  • 问题内容: 我编写了一个脚本,该脚本在用户每次登录我们域中的计算机时运行。此脚本记录用户以及他们登录的计算机。任意数量的用户可以登录任意数量的计算机。 我只是从一个不在的顾问那里继承了这个IT环境,并且正在编写这个小查询,因此当接到用户的呼叫时,我可以按该用户的名字进行搜索,并合理地预测该用户正在使用的计算机。他们登录到任何给定计算机的次数。 这是“登录”表中数据的示例: 我要敲定的逻辑是跨多个列

  • 问题内容: 我正在寻找一种等效于SQL的方法 pandas sql比较与无关。 仅适用于单个列,因此我想我可以合并这些列,或将它们放在列表/元组中并进行比较,但这似乎是熊猫应该以更原生的方式进行的操作。 我是否缺少明显的东西,或者没有办法做到这一点? 问题答案: 您可以使用该方法来获取DataFrame中的唯一行: 如果只想使用某些列来确定唯一性,则也可以提供关键字参数。请参阅文档字符串。

  • 问题内容: 我如何使用JPA条件API执行以下操作: 使用CriteriaBuilder.countDistinct在一个列/路径上执行此操作很简单,但是如何在两个路径/列上执行此操作? 问题答案: 这是一个较晚的答案:-)尽管我不确定情况是否有所改变。 最近,我遇到了非常相同的需求,并使用concat解决了该需求,即通过将列连接为 伪列 ,然后将其连接到 伪列 上。 但是我不能使用,因为它生成了