2015-02-25 1 views
0

В Android У меня есть таблица, в которой хранятся значения широты и долготы, а также соответствующий идентификатор, связанный с каждой строкой. когда я использую запросAndroid SQLiteDatabase.query() GROUP BY/HAVING с более чем одним столбцом не работает

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 лат 34 LNG я должен получить 123, 143 т.е. количество как 2 и для других, я должен получить считается 1

+0

'Я хочу получить только количество заданий с уникальными значениями long long. -> Если вы хотите получить количество задач, почему вы выбираете значения широты и долготы? – iRuth

+0

с такой же широтой и долготой, что может быть несколько задач. поэтому я хочу получить уникальный lat lng и иметь соответствующие задачи с ним. –

+0

@Android_Rocks Я обновил свой ответ, чтобы включить образец кода. http://stackoverflow.com/a/28713682/3063884 – CJBS

ответ

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 
+0

запрос работает отлично в браузере sqlite, но в коде Android он не –

+0

@Android_Rocks Когда вы говорите, что он работает в браузере, но не в коде, что вы имеете в виду ? Когда я запускаю запрос, он дает одну строку (как вы ожидаете).Какая ошибка (или другой результат) вы получаете в Android, и какой код вы используете для ее выполнения? – CJBS

+0

Я пытался сказать, что вы не «именовали» столбец должным образом - http://stackoverflow.com/questions/6744803/sqlite-count-group-and-order-by-count – Jim

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 

Если у вас возникли проблемы с выполнением SQL с помощью SQLiteDatabase.query(), а затем разместить пример кода с выходом (или неудачи), так что проблему можно диагностировать.

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()); 
} 

Там нет обработки ошибок, и я предложил бы использовать класс DB Utilities, который расширяет SQLiteOpenHelper, но это должно заставить вас идти.