Wie würde ich so etwas machen?
SQL SELECT Zeile FROM Tabelle WHERE id = max (id)
Wie würde ich so etwas machen?
SQL SELECT Zeile FROM Tabelle WHERE id = max (id)
Antworten:
Sie könnten eine Unterauswahl verwenden:
SELECT row
FROM table
WHERE id=(
SELECT max(id) FROM table
)
Beachten Sie, dass max(id)
mehrere Zeilen zurückgegeben werden , wenn der Wert von nicht eindeutig ist.
Wenn Sie nur eine solche Zeile möchten, verwenden Sie die Antwort von @ MichaelMior.
SELECT row from table ORDER BY id DESC LIMIT 1
id
ist nur eine Spalte in einer Tabelle. Es gibt keine Garantie dafür, dass die Werte in der id
Spalte eindeutig sein müssen.
id
ist kein Primär- oder eindeutiger Schlüssel :) Angesichts des Namens besteht eine vernünftige Chance, dass dies der Fall ist. Es ist auch erwähnenswert, dass der Ansatz mit der Unterauswahl je nach verwendetem DBMS möglicherweise viel weniger effizient ist.
id
könnte ein Fremdschlüssel sein, in diesem Fall ist er möglicherweise nicht eindeutig. Ich habe ein Benchmarking set profiling = 1; ...; show profiles
mit MySQL durchgeführt und es scheint, dass unsere Lösungen mit MySQL die gleiche Leistung haben. Wissen Sie nach meinem eigenen Wissen, welches DBMS für Unterauswahlen eine schlechtere Leistung aufweist?
Sie könnten auch tun
SELECT row FROM table ORDER BY id DESC LIMIT 1;
Dadurch werden die Zeilen in absteigender Reihenfolge nach ihrer ID sortiert und die erste Zeile zurückgegeben. Dies entspricht der Rückgabe der Zeile mit der maximalen ID. Dies setzt natürlich voraus, dass dies id
in allen Zeilen eindeutig ist. Andernfalls kann es mehrere Zeilen mit dem Maximalwert für geben, id
und Sie erhalten nur eine.
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
SELECT entry FROM table WHERE id = MAX(id)
würde nicht funktionieren ?!
SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)
wobei ich nur entry_time
den neuesten Eintrag in der Datenbank brauche . Ist diese Aussage ausreichend oder sollte es sein:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
Sie können nicht geben, order by
weil order by
ein "vollständiger Scan" auf einer Tabelle durchgeführt wird.
Die folgende Abfrage ist besser:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
ORDER BY
führt keinen vollständigen Scan durch, wenn Sie davon ausgehen, dass dies id
der Primärschlüssel der Tabelle ist. (Und wenn nicht, ist es ziemlich schlecht benannt.) Wenn nicht, wie erwarten Sie MAX(id)
, ohne einen vollständigen Tabellenscan zu arbeiten? Wenn kein Index vorhanden ist, muss noch jeder Wert überprüft werden, um das Maximum zu ermitteln.
Versuchen Sie es damit
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table
Man kann sich auch immer für analytische Funktionen entscheiden, die Ihnen mehr Kontrolle geben
select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1
Wenn Sie je nach Datentyp Probleme mit der Funktion rank () haben, können Sie auch zwischen row_number () und dens_rank () wählen.