2017-07-21 4 views
1

Ich verwende SQLite für eine Android App.SQLite LINKS JOIN + GROUP BY + ORDER BY

Ich habe zwei Tabellen: Thema und Nachricht. Ich möchte alle Themen sowie die Anzahl der Nachrichten für diese Themen und die letzte Nachricht dieses Themas als eine einzige Anfrage (mit Unterabfrage) auswählen.

Ich habe versucht, die folgenden:

SELECT topic.*, COUNT(message.id), message.* FROM topic 
LEFT JOIN (SELECT * FROM message ORDER BY message.ts DESC) AS message 
ON topic.id=message.topic_id 
GROUP BY topic.id; 

Diese Abfrage funktioniert völlig in Ordnung, wenn ich es auf MySQL auf der Server-Seite versuchen. Allerdings funktioniert es nicht wie erwartet auf der Android App mit SQLite: Ich bekomme alle Themen und die richtige Anzahl von Nachrichten, aber die letzte Nachricht ist nicht die letzte (scheint wie die ORDER BY in der Unterabfrage ist nicht sinnvoll).

Irgendwelche Hinweise?

EDIT: message.ts ist ein TEXT NOT NULL mit einem ts formatiert als "JJJJ-MM-TT HH: mm: ss.SSS". Wenn ich alle Nachrichten abfragen und sie nach ts ordnen, ist die Reihenfolge in Ordnung.

Antwort

2

Wenn Sie Aggregation verwenden, zu gewährleisten, ist der einzige Weg, dass eine bestimmte Zeile aus der Gruppe is to use MIN() or MAX() zurückgegeben:

SELECT topic.*, 
     COUNT(*), 
     message.*, 
     MAX(message.ts) 
FROM topic 
LEFT JOIN message ON topic.id = message.topic_id 
GROUP BY topic.id; 
+0

fantastisch, das funktioniert völlig in Ordnung! –