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
id
to tylko kolumna w tabeli. Nie ma gwarancji, że wartości w id
kolumnie muszą być unikalne.
id
nie 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.
id
może być kluczem obcym, w takim przypadku może nie być unikatowy. Przeprowadziłem kilka testów porównawczych set profiling = 1; ...; show profiles
i 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 id
jest wyjątkowy wśród wszystkich rzędów. W przeciwnym razie może istnieć wiele wierszy z maksymalną wartością dla, id
a 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_time
najnowszego 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 by
ponieważ order by
robi "pełne skanowanie" na stole.
Następujące zapytanie jest lepsze:
SELECT * FROM table WHERE id = (SELECT MAX(id) FROM table);
ORDER BY
nie wykona pełnego skanowania, jeśli założysz, że id
jest 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