在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
答案 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时遇到问题,请发布带有输出(或失败)的代码示例,以便可以诊断问题。
对于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