Jak bym zrobił coś takiego?
SQL SELECT wiersz FROM table WHERE id = max (id)
Jak bym zrobił coś takiego?
SQL SELECT wiersz FROM table WHERE id = max (id)
Odpowiedzi:
Możesz użyć podselekcji:
SELECT row
FROM table
WHERE id=(
SELECT max(id) FROM table
)
Zwróć uwagę, że jeśli wartość max(id)nie jest unikalna, zwracanych jest wiele wierszy.
Jeśli chcesz tylko jeden taki wiersz, użyj odpowiedzi @ MichaelMior,
SELECT row from table ORDER BY id DESC LIMIT 1
idto tylko kolumna w tabeli. Nie ma gwarancji, że wartości w idkolumnie muszą być unikalne.
idnie jest to klucz podstawowy ani unikalny :) Biorąc pod uwagę nazwę, istnieje duża szansa, że tak jest. Warto również zauważyć, że w zależności od używanego DBMS, podejście z podselektem może być znacznie mniej wydajne.
idmoże być kluczem obcym, w takim przypadku może nie być unikatowy. Przeprowadziłem kilka testów porównawczych set profiling = 1; ...; show profilesi wygląda na to, że nasze rozwiązania mają taką samą wydajność przy użyciu MySQL. Z mojej własnej wiedzy, czy wiesz, który DBMS ma gorszą wydajność dla podselekcji?
Ty też możesz to zrobić
SELECT row FROM table ORDER BY id DESC LIMIT 1;
Spowoduje to posortowanie wierszy według ich identyfikatorów w porządku malejącym i zwrócenie pierwszego wiersza. To to samo, co zwrócenie wiersza z maksymalnym identyfikatorem. To oczywiście zakłada, że idjest wyjątkowy wśród wszystkich rzędów. W przeciwnym razie może istnieć wiele wierszy z maksymalną wartością dla, ida otrzymasz tylko jeden.
SELECT *
FROM table
WHERE id = (SELECT MAX(id) FROM TABLE)
SELECT entry FROM table WHERE id = MAX(id)nie zadziała ?!
SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified WHERE account_email = :account_email)przy czym potrzebuję tylko entry_timenajnowszego wpisu w bazie danych. Czy to stwierdzenie jest wystarczające, czy powinno być:SELECT entry_time FROM users_unverified WHERE num_id = (SELECT MAX(num_id) FROM users_unverified) AND account_email = :account_email
Nie możesz dać, order byponieważ order byrobi "pełne skanowanie" na stole.
Następujące zapytanie jest lepsze:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
ORDER BYnie wykona pełnego skanowania, jeśli założysz, że idjest to klucz podstawowy tabeli. (A jeśli tak nie jest, jest raczej słabo nazwane). Jeśli nie, jak spodziewasz MAX(id)się pracy bez pełnego skanowania tabeli? Jeśli nie ma indeksu, każda wartość musi zostać sprawdzona, aby znaleźć maksimum.
Zawsze można też skorzystać z funkcji analitycznych, które zapewnią większą kontrolę
select tmp.row from ( select row, rank() over(partition by id order by id desc ) as rnk from table) tmp where tmp.rnk=1
Jeśli napotkasz problem z funkcją rank () w zależności od typu danych, możesz również wybrać row_number () lub dense_rank ().
Spróbuj z tym
SELECT top 1 id, Col2, row_number() over (order by id desc) FROM Table