[MySQL][PHP] jak pobrać z bazy przedostatni rekord?

Witam,

potrzebuję w swoim skrypcie odczytać z bazy przedostatni rekord… Poprzestałem na momencie, że pobieram z bazy dwa ostatnie rekordy… Ale jednak chciałbym wyświetlić tylko jeden, ten właściwy…

Gdzie widzisz problem w pobraniu dwóch rekordów, a w wyświetleniu tylko jednego z nich? Możesz pobrać wszystkie, a wyświetlić tylko jeden (oczywiście nie jest to zalecane ze względu wydajnościowych).

To jak tego dokonać w lepszy sposób lub przynajmniej w ten opisany przeze mnie? Zawsze wyświetlałem jedynie kolejne rekordy i mówiąc szczerze - nie mam pojęcia jak to zrobić.

Pobierasz dwa rekordy z bazy (prawdopodobnie te dwa, które mają największe ID). Przy wypisywaniu, wypisujesz ten z mniejszym ID (instrukcja if).

Coś takiego?

SELECT * 

FROM `test` 

WHERE `id` = ( 

SELECT MAX( `id` ) -1

FROM `test` )

@UP

Nie ma pewności, że id są kolejne (nie można tego zakładać). O wiele szybsze z punktu biznesowego i wydajnościowego, będzie wybrać dwa ostatnie rekordy. I po stronie kodu wyświetlić jeden z nich. Ile może mieć kolumn z 50? Rekordów z reguły ma się już dużo.

Póki co pisałem skrypty mniej więcej tak:

$pobierz = mysql_query("SELECT * FROM tabela WHERE data='$date' ORDER BY id DESC LIMIT 2");

while($baza = mysql_fetch_array($pobierz)) {

echo $baza['nick'];

}

Możesz mi powiedzieć jak to przerobić, by wyświetlił się prawidłowy rekord?

Przy takim sposobie pobierania wystarczy, że wypiszesz drugi rekord (bo są one uporządkowane). Jak pominąć pierwszy rekord? Trzeba przesunąć kursor, aby to osiągnąć można np. wywołać fetch wcześniej. Wtedy znika też potrzeba używania pętli w ogóle (dla dwóch rekordów).

$pobierz = mysql_query("SELECT * FROM tabela WHERE data='$date' ORDER BY id DESC LIMIT 2");$baza = mysql_fetch_array($pobierz)) {$baza['nick'];[/code]Tu pobierasz dwa najnowsze rekordy. ([b]desc[/b])


[code=php]$pobierz = mysql_query("SELECT * FROM tabela WHERE data='$date' ORDER BY id LIMIT 2");$baza = mysql_fetch_array($pobierz)) {$baza['nick'];Spróbuj z tym :)

Powyższe nie zrobi tego, co jest rezultatem oczekiwanym.

Dodane 22.09.2013 (N) 0:12

Nie siedzę w MySQL, ale znalazłem jeszcze jedno rozwiązanie z użyciem Offset-u w LIMIT

SELECT * FROM tabela ORDER BY id DESC LIMIT 1,1

Niemniej nie wiem na ile wydajnie działa LIMIT. Poza tym i tak polecam podejście pierwsze, jako, że jest bardziej “portable”.