Autor Zpráva
Martin
Profil
Ahoj,
chtěl jsem se jen zeptat jak se dá z databáze vypsat jen posledních pět záznamů, který maj nejvyšší id co nejjednodušeji...Díky
Michalek
Profil
mysql_query ("select from tabulka bunka order by id desc limit 0,5")

to ti vybere pet poslednich, myslim, priblizne by to tak melo byt
thingwath
Profil *
SELECT * FROM tabulka ORDER BY id DESC LIMIT 5;

Místo * pochopitelně případně žádané sloupce.
Martin
Profil
JO díky. to fachá dobře..........ale co mám udělat aby se mi vybraný záznami vypsali pospátku?
thingwath
Profil *
Od toho je tam to DESC, obrácené řazení.
Martin
Profil
Asi sem se špatně vyjádřil.....tohle mi SELECT * FROM tabulka ORDER BY id DESC LIMIT 5; vybere posledních pět záznamů...a když těch posledních pět záznamů budu chtít vypsat pozpátku...udělám co? Díky
mipo
Profil
Ak som ťa správne pochpil, tak stačí, aby si namiesto DESC napísal ASC. Jestli se nejmejlím:-)
Michalek
Profil
2 mipo, ale to ti vybere obrazky s nejmensim id, on potrebuje vybrat pet poslednich obrazku a vypsat je obracene

priklad:
potrebuje vybrat z 1 2 3 4 5 6 7 8 9 10
pouze 6 7 8 9 10
a vypsat je jako 10 9 8 7 6 :-)
llook
Profil
Jedna možnost je načíst si do pole všechny ty záznamy a pak to převrátit (array_reverse).
Problém by ale nastal, kdyby to pole mělo víc než je memory_limit, tedy obvykle 8MB. Pak by se asi musel pro každý řádek dělat zvlášť dotaz, nebo použít jiný DBMS.
thingwath
Profil *
Šlo by to udělat velmi snadno jedním vnořeným selectem, ale to máme v MySQL verze 4.0 a nižší smůlu ... MySQL 4.1+ a každá jiná rozumná databáze to umí.
Martin
Profil
Na serveru je verze 4.0.22 to neni 4.0 a nižší ale zase to neni 4.1 :-) jak by prosim tě zněl ten vloženej select? Díky
thingwath
Profil *
No, vypadlo by to asi jako SELECT id FROM (SELECT id FROM tabulka ORDER BY id DESC LIMIT 5) AS dotaz ORDER BY id ASC;

Nebo možná trochu jinak (nejsem si jist tím řazením).

4.0.22 chápu jako 4.0 a nižší (4.0 a nižší je u mě všechno co začíná na 4.0, takže i 4.0.22).
Honza Hučín
Profil
Dá se to udělat jediným dotazem fungujícím i v nižších verzích MySQL. Takové věci se dělají propojením tabulky se sebou samotnou pomocí podmínky s nerovností:

select a.*, count(b.id) as poradi
from tabulka as a join tabulka as b on a.id<=b.id
group by a.id
having poradi<=5
order by poradi desc;

Netestoval jsem to, ale mělo by to fungovat. Podstata je v tom, že ke každému záznamu z tabulky se spojí všechny záznamy z téže tabulky, které mají stejnou nebo větší hodnotu id. Když se to pak seskupí, spočítá se, kolik ostatních záznamů v tabulce má stejné nebo větší id. Klauzule HAVING po seskupení omezí záznamy jen na ty, které mají nejvýše jiných se stejným nebo vyšším id - tedy na 5 záznamů s nejvyšším id. No a ORDER BY to seřadí.

Podobná finta se používá u obecného výpočtu pořadí, viz
http://suplik.petnik.cz/index.php?cl=223
Tomas
Profil *
No a když chci potom výsledek spojit ještě s jednou tabulkou? Dík
Honza Hučín
Profil
A nemůžeš to spojit už v tomhle selectu? Třeba takhle:

select a.*, count(b.id) as poradi, c.*
from (tabulka as a join tabulka as b on a.id<=b.id)
join jinatabulka as c on a.propojovacipole=c.propojovacipole
group by a.id
having poradi<=5
order by poradi desc;

Tou závorkou za from si nejsem z hlavy úplně jistý, ale pokud by to nefungovalo přes join, dají se tabulky propojit i v klauzuli WHERE. Samozřejmě se musí ohlídat seskupování pomocí GROUP BY, ale to už záleží na konkrétním případu.
Toto téma je uzamčeno. Odpověď nelze zaslat.