Autor Zpráva
mark92
Profil
zdravím, neviete, prečo mi nefunguje tento kód?
$dat = mysql_query("SELECT TOP 1 * from uzivatelia");
$riadok = Mysql_Fetch_Array($dat);
echo $riadok["id"];

snažím sa vybrať posledný riadok v tabuľke, no vypisuje mi, že $dat je boolean - false...
Anonym
Profil *
Myslím si že to mysql nezná
poslední záznam bych tipl na
SELECT * FROM uzivatelia ORDER BY id DESC LIMIT 1

a první na
SELECT * FROM uzivatelia ORDER BY id ASC LIMIT 1

předpokládám, že existuje sloupec id jako primary autoincrement
mark92
Profil
toto riešenie ma napadlo ako prvé, no prišlo mi to ako veľmi neekonomické... mám totiž tabuľku s užívateľmi, každý má svoje id a tie sú radené v databáze od najmenšieho po najväčšie, čiže pri vkladaní nového užívateľa do databázy som nemal chuť vyhľadávať maximálnu hodnotu id, keď viem, že je v poslednom riadku... takže musím to riešiť cez
SELECT max(id) AS id FROM uzivatelia
?
to bude asi rýchlejšie ako
SELECT * FROM uzivatelia ORDER BY id DESC LIMIT 1

alebo sa mýlim?
Anonym
Profil *
nevím - nevidím do toho, ale selský rozum mi říká, že
SELECT * FROM uzivatelia ORDER BY id DESC LIMIT 1

prostě vezme poslední řádek z tabulky
kdežto
SELECT max(id) AS id FROM uzivatelia

provede jakoby výpočet navíc - nejdřív vypočítá max a potom hledá řádek
ale říkám, že to nevím jistě
Alphard
Profil
O jak velkých tabulkách se bavíme?
Obecně, pokud je na sloupci id index (což předpokládám, že je to primary key), neměl by to být problém.

Váš zápis s max není ekvivalentní, vybírá jen sloupec id, musel byste ho sestavit jako
select * from tabulka where id = (select max(id) from tabulka)
Co bude rychlejší si netroufám říct. Nejlépe, když to zkusíte na své tabulce.
mark92
Profil
vďaka, čo sa týka veľkosti tabuľky, ak mám hovoriť v optimistických číslach, tak cez 10 000 riadkov a na id je primary key... ešte som sa chcel spýtať, dajú sa kombinovať príkazy update a select typu: výber updatovaného riadku s podmienkou, že id je maximálne id v tabuľke? alebo na to treba 2 samostatné SQL príkazy? teda niečo v zmysle:
SELECT * FROM (UPDATE uzivatelia SET online=1 WHERE id=(select max(id) from tabulka));

alebo inými slovami, možu byť ako poddotazy iné príkazy, ako SELECT? vďaka
LosFilipos
Profil
mark92:
Zkoušel jsi někdy last_insert_id?
SELECT LAST_INSERT_ID() FROM uzivatele
Nox
Profil
LosFilipos:
Zkoušel jsi někdy last_insert_id?

Nejspíš to funguje jen když byl předtím insert. Když jsem to teď zkusil na tabulku, která má 1 PK auto_inc ale dlouho se na ni nešahalo, tak to vrací akorát kvanta nul
Alphard
Profil
[#6] mark92
Pokud vím, tak ne.
Proč nepoužijete dva dotazy? V závislosti na konkrétní situaci možná 3 s tím, že 1. select by vybral patřičná id, aby se zamezilo možným problémům s paralelním přístupem.
mark92
Profil
Nieje to tak, že zloženie viacerých SQL príkazov do jedého znamená urýchlenie chodu programu? ak som manuály dobre čítal, tak algoritmy je pokial možno dobré nechávať na databázy, lebo bežia rýchlejšie, ako PHP a prešli silnými optimalizáciami počas doby ich vývoja. Preto mi pripadal dátový proces typu PHP->MYSQL->PHP->MYSQL atď. viacerými SQL príkazmi ako plytvanie rýchlosti servera, no teraz neviem... inak aké problémy môžu nastať paralelným prístupom?
Alphard
Profil
mark92:
Optimalizaci nelze popsat obecně do jednoho příspěvku. Je nutná znalost obecných věcí, dané databáze a samozřejmě záleží na konkrétním problému.

Nieje to tak, že zloženie viacerých SQL príkazov do jedého znamená urýchlenie chodu programu?
Ne vždy. Složitý dotaz může být pomalejší než více jednoduchých. Dotazy se různě cachují apod. podívejte se na explain.

PHP->MYSQL->PHP->MYSQL
Tohle je skutečně lepší přepsat do MySQL, lze-li to nějak rozumně.

nak aké problémy môžu nastať paralelným prístupom?
Čtěte, nikomu se nebude chtít odpovídat na obecné dotazy, když je všude hromada článků :-)
mark92
Profil
vďaka moc krát za informácie :-)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0