Android SQLiteDatabase.query()GROUP BY / HAVING,多个列不起作用

时间:2015-02-25 06:19:48

标签: android sqlite having

在Android中,我有一个存储纬度和经度值的表,以及与每一行相关联的相应ID。当我使用查询时

SELECT latitude, longitude, COUNT(*) count
FROM tasks
GROUP BY latitude, longitude
HAVING count > 1

它仅按纬度而非经度给我分组。我该怎么做到这一点?我想获得具有唯一lat long值的任务计数。有什么方法可以使用Android SQLite实现这一目标吗?例如,表格中包含此数据......

lat   lng   id
12    34    123
12    34    143
12    35    147
11    35    412

...对于12 lat 34 lng我必须得到123,143,即算作2 而对于其他人,我应该算作1

2 个答案:

答案 0 :(得分:2)

重新创建场景......

CREATE TABLE tasks 
    (
     lat integer, 
     lng integer, 
     id  integer
    );

INSERT INTO  tasks (lat, lng, id) VALUES (12, 34, 123);
INSERT INTO  tasks (lat, lng, id) VALUES (12, 34, 143);
INSERT INTO  tasks (lat, lng, id) VALUES (12, 35, 147);
INSERT INTO  tasks (lat, lng, id) VALUES (11, 35, 412);

选择指定的查询(注意数据示例中的列名匹配表)

SELECT lat, lng, COUNT(*) count FROM tasks
GROUP BY lat, lng HAVING count > 1

给出以下内容:

lat   lng   count
12    34    2

...这与你的期望是一致的,除了"而对于其他人,我应该算作1"。要解决这个问题,并获取所有行,请移除HAVING count > 1,让您产生

lat   lng   count
11    35    1
12    34    2
12    35    1

如果您在使用SQLiteDatabase.query()执行SQL时遇到问题,请发布带有输出(或失败)的代码示例,以便可以诊断问题。

Fiddling with this query

对于Android中的代码,这里有一个使用rawQuery的示例。这似乎支持HAVING条款。

SQLiteDatabase db = SQLiteDatabase.create(null);

db = SQLiteDatabase.openDatabase("/data/data/com.mycompany.myapp/databases/myDB.db", null,    SQLiteDatabase.OPEN_READONLY, null);

Cursor cursor = db.rawQuery("SELECT lat, lng, COUNT(*) count  FROM tasks GROUP BY lat, lng  HAVING  count  > 1 ", new String [] {});

// Iterate through cursor
if(cursor.moveToFirst())
{
    do
    {
        Integer lat = cursor.getInt(0);
        Integer lng = cursor.getInt(1);
        Integer count = cursor.getInt(2);

        // Do something here with lat, lng, count

    }
    while(cursor.moveToNext());
}

没有错误处理,我建议使用扩展SQLiteOpenHelper的数据库实用工具类,但这应该可以帮助你。

答案 1 :(得分:1)

它看起来像是SQL中的一个问题。为列创建Alias时,您可能应该使用“AS”关键字。

我认为你的SQL语句应该是:

SELECT latitude, longitude, COUNT(*) AS count FROM tasks GROUP BY latitude, longitude HAVING count > 1

SELECT latitude, longitude, COUNT(*) FROM tasks GROUP BY latitude, longitude HAVING COUNT(*) > 1