将不同的行合并为一个并计算合并的行数

时间:2017-09-10 21:46:30

标签: android sqlite android-sqlite sqliteopenhelper

我们说我的表格中有以下行:

ExternalID   Count   Descriptor
   1           1        val-1
   1           1        val-2
   2           1        val-3
   2           1        val-4
   2           1        val-5
   2           1        val-6
   3           1        val-7

我需要完成这样的事情:

ExternalID   Count       Descriptor
   1           2        val-1, val-2
   2           3        val-3, val-4, val-5
   3           1        val-7

这样的事情会成为可能吗?

2 个答案:

答案 0 :(得分:1)

这可能是关键数据库可用功能的完成或最佳利用。

这似乎是利用关系的基础。

如何考虑外部ID的表和描述符的表,然后是链接表(关联表或许多其他名称用于表示关系的表)。

e.g。

CREATE TABLE externals (_id PRIMARY INTEGER KEY, extid INTEGER)
CREATE TABLE descriptors (_id PRIMARY INTEGER KEY, descriptor TEXT)
CREATE TABLE link_externals_to_descriptors (external_ref INTEGER NOT NULL, descriptor_ref INTEGER NOT NULL)

所以对于上面你有(注意我已经使用id&#39-12和100-106只是为了说明目的而轻易区分): -

外部表

 _id       extid

 10        1
 11        2
 12        3
 99        9

描述符表

_id        descriptor
100        val-1
101        val-2
102        val-3
103        val-4
104        val-5
105        val-6
106        val-7

链接表(link_externals_to_descriptors)

external_ref         descriptor_ref
1                    100
1                    101
2                    102
2                    103
2                    104
3                    106
99                   100
99                   102
99                   104
99                   105
99                   107

这似乎也可能过于复杂,但应对externalID和描述符之间的一对多,多对多关系。

即。 99 相当于

9                   val-1, val-3, val-5, val-6, val-7

(除了其他人使用的val-6除外)

不需要合并或取消合并,将csv拆分为单独的描述符。你得到你想要的东西。 e.g。

SELECT * FROM link_externals_to_descriptors WHERE external_ref = 99;

用于驱动查询将返回一个游标,其数量(行数)将是外部id的描述符数。

因此,以下内容可用于获取计数和描述符(将信息输出到日志): -

Cursor csr = db.query("link_externals_to_descriptors",
    null,
    "external_ref=?",
    new String[]{"99"},
    null,null,null);
int my_count_of_descriptors = csr.getCount()
Log.d("MYINFO","The number of Descriptors for EXTID 99 is" +
    Integer.toString(my_count_of_descriptors) +
    " They are:-");
while(csr.moveToNext) {
    Log.d("MYINFO","\t" + csr.getString(csr.getColumnIndex("descriptor_ref")));
}
csr.close();

答案 1 :(得分:1)

要在查询时为每个组获取一个输出行,请使用GROUP BY,并使用aggregation functions合并值:

SELECT ExternalID,
       COUNT(*),
       group_concat(Descriptor)
FROM myTable
GROUP BY ExternalID;

如果原始Count值很重要,请将COUNT(*)替换为SUM(Count)