Запрос SQLite: выбор самой новой строки для каждого отдельного контакта - PullRequest
1 голос
/ 18 сентября 2011

Я работаю с базой данных Android SQLite, и у меня есть таблица с сообщениями. Каждое сообщение имеет ContactId. Мне нужно получить список новейших сообщений, связанных с каждым ContactId.

Мой запрос выглядит так:

SELECT * FROM messages GROUP_BY ContactId HAVING ( COUNT(ContactId) = 1 ) ORDER_BY MessageTime DESC

Однако, когда я запускаю запрос, я получаю это исключение:

near "ContactId": syntax error: , while compiling: SELECT * FROM messages GROUP_BY ContactId HAVING ( COUNT(ContactId) = 1 ) ORDER_BY MessageTime DESC

Вот определение таблицы на случай, если это поможет:

create table messages (_id integer primary key autoincrement, ContactId text not null, ContactName text not null, ContactNumber text not null, isFrom int not null, Message text not null, MessageTime int not null);

Ответы [ 2 ]

2 голосов
/ 18 сентября 2011

Вот два способа сделать это.

Этот запрос создает список самых последних раз для каждого пользователя, а затем СОЕДИНЯЕТ его обратно в таблицу сообщений, чтобы получить информацию о сообщении:

 SELECT M1.* FROM messages M1 JOIN 
   (SELECT ContactId, MAX(MessageTime) AS MessageTime FROM messages GROUP BY ContactId) M2
   ON M1.ContactID = M2.ContactID AND M1.MessageTime = M2.MessageTime;

Этот запрос делает что-то немного другое. Он просматривает каждое сообщение и спрашивает, существует ли какое-либо более позднее сообщение для того же контакта. Если нет, строка должна быть самой последней:

 SELECT M1.* FROM messages M1
    WHERE NOT EXISTS (SELECT * FROM M2 
      WHERE M2.ContactID = M1.ContactID AND M2.MessageTime > M1.MessageTime)
2 голосов
/ 18 сентября 2011

ПРИМЕЧАНИЕ: Похоже, что мой ответ ниже не работает с SQLite 3.7.5, я предлагаю использовать запрос "JOIN", предложенный Ларри.

Вы близко. Вам нужно сначала отсортировать все записи, используя таблицу подзапросов, а затем сгруппировать их. Значения, которые возвращаются в наборе результатов, будут из последней строки в каждой группе. Таким образом, вы действительно хотите, чтобы новые сообщения появлялись внизу, если вы пытаетесь получить новое сообщение. «GROUP BY» уже гарантирует, что вы получите одну строку для каждого ContactId.

SELECT * FROM (SELECT * FROM messages ORDER BY MessageTime) GROUP BY ContactId

Предложение HAVING не требуется. Я не использовал его раньше, но в соответствии с документами, предложение HAVING отбрасывает целые группы, которые не совпадают, но не похоже, что вы хотите, чтобы какие-либо группы были отброшены, вам нужны результаты из каждого ContactId.

Также обратите внимание, что в "ORDER BY" или "GROUP BY" нет подчеркивания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...