Mein Problem scheint eine viel einfachere Lösung zu haben als das, was ich mir ausgedacht habe. Beginnend mit diesem Datensatz:
log_table
+--------+-----------+------------------+---------+
| log_id | entity_id | date | comment |
+--------+-----------+------------------+---------+
| 1 | A | 2012-10-23 07:50 | foo |
| 2 | B | 2012-10-23 07:59 | bar |
| 3 | B | 2012-10-23 08:11 | baz |
| 4 | A | 2012-10-23 08:23 | bat |
+--------+-----------+------------------+---------+
Angenommen, ich wollte das späteste Datum der Protokolleinträge für jede Entität erhalten, damit das Ergebnis wie folgt aussieht:
Results:
+-----------+------------------+--------------+
| entity_id | last_log_date | last_comment |
+-----------+------------------+--------------+
| B | 2012-10-23 08:11 | baz |
| A | 2012-10-23 08:23 | bat |
+-----------+------------------+--------------+
Ich verwende derzeit MySQL, das ungefähr so aussieht:
SELECT
`entity_id`,
`date` AS last_log_date,
`comment` AS last_comment
FROM (
SELECT *
FROM `log_table`
ORDER BY `date` DESC, log_id ASC
) AS `ordered_log`
GROUP BY `entity_id`
Das funktioniert gut, aber es scheint mir nicht sehr effizient zu sein. Es muss doch einen besseren Weg geben, dies zu tun.
quelle
entity_id
und diedate
Spalten. Idealerweise sollte die Abfrage mehr oder weniger sofort ausgeführt werden, wenn möglich ...entity_id
unddate
Spalten oder einen Index über beide Spalten?SELECT entity_id,MAX(last_log_date) last_log_date FROM log_table GROUP BY entity_id
Teils) und das ist die Zeit, die zum Ausführen benötigt wird (es dauert immer noch 11 Sekunden). Es scheint mir, dass dies nicht schneller gehen wird?SELECT entity_id, MAX(`date`) last_log_date FROM log_table GROUP BY entity_id
) dauert allein 8 Sekunden. Was ich in meinem letzten Kommentar gefragt habe, ist, ob es eine Möglichkeit gibt, die Leistung nur dieser Abfrage erheblich zu steigern - das würde höchstwahrscheinlich alle Probleme lösen ...Die Unterabfrage funktioniert; So würden Sie es ohne Unterabfrage machen:
Die obige Abfrage wird verwendet
GROUP_CONCAT
, um eine lange Verkettung von Werten pro Gruppe zu generieren, die dann analysiert wird, um das erste Token über zu extrahierenSUBSTRING_INDEX
.Sie könnten es auf hervorragende Weise lösen, wenn nur MySQL Fensterfunktionen (auch als analytische Funktionen bezeichnet) unterstützt. Es tut es nicht und wir bleiben mit Hacks herum
GROUP_CONCAT
.quelle
date
) sollte für meine Abfrage gut geeignet sein.