Internet Info, s.r.o. Lupa Měšec Podnikatel Root Zdroják DigiZone Slunečnice Vitalia TopDrive KupDnes Navrcholu NovýTarif Dobrý web Weblogy Woko Jagg Computer.cz SK: MojeLinky

Hlavní navigace

PHP okénko: Získání počtu řádek

Druhý díl PHP okénka přináší drobný postřeh z programování v PHP, který se týká možných způsobů získání počtu řádek databázové tabulky.

Tweetni to Twitter Jaggni to! Jagg Del.icio.us Delicious

Často je potřeba získat počet řádek, které obsahuje databázová tabulka. A jako obvykle k tomu vede více cest.

<?php
// neefektivní
$pocet = mysql_num_rows(mysql_query("SELECT * FROM tabulka"));

// rychlejší
$pocet = mysql_result(mysql_query("SELECT COUNT(*) FROM tabulka"), 0);
?> 

První způsob je neefektivní proto, že SQL server se připraví na to, že bude vracet všechna data z tabulky, a připraví si na to potřebné struktury. Druhý způsob je naproti tomu velice rychlý, protože MySQL jenom vezme počet řádků tabulky, který si vede jako statistický údaj, a vrátí ho. Funkci mysql_num_rows je vhodné použít pouze v případě, kdy data z tabulky budeme tak jako tak potřebovat, tedy např.:

<?php
$result = mysql_query("SELECT * FROM tabulka");
echo "Celkový počet záznamů: " . mysql_num_rows($result) . "\n";
while ($row = mysql_fetch_assoc($result)) {
    // zpracování tabulky
}
mysql_free_result($result);
?> 

Další problém je potřeba vyřešit v případě, kdy sice chceme zjistit celkový počet řádků tabulky, ale chceme jich vypsat jen několik.

TIB2012

       
<?php
// neefektivní
$pocet = mysql_result(mysql_query("SELECT COUNT(*) FROM tabulka /* WHERE složitá podmínka */"), 0);
$result = mysql_query("SELECT * FROM tabulka /* WHERE složitá podmínka */ LIMIT $limit OFFSET $offset");
while ($row = mysql_fetch_assoc($result)) {
    // zpracování řádku
}
mysql_free_result($result);

// taktéž neefektivní
$result = mysql_query("SELECT * FROM tabulka /* WHERE složitá podmínka */");
$pocet = mysql_num_rows($result);
if ($offset < $pocet) {
    mysql_data_seek($result, $offset);
    $i = 0;
    while ($row = mysql_fetch_assoc($result)) {
        // zpracování řádku
        $i++;
        if ($i >= $limit) {
            break;
        }
    }
}
mysql_free_result($result);

// elegantní, ale jde použít pouze v MySQL a to až od verze 4
$result = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM tabulka /* WHERE složitá podmínka */ LIMIT $limit OFFSET $offset");
$pocet = mysql_result(mysql_query(" SELECT FOUND_ROWS()"), 0);
while ($row = mysql_fetch_assoc($result)) {
    // zpracování řádku
}
?> 

První způsob je neefektivní pro dotazy se složitými podmínkami (např. vyhledávání podle masky) nebo složitě spojující více tabulek, druhý způsob je neefektivní pro vysoký $offset. To, že je úloha získání celkového počtu řádků společně s vrácením jen několika z nich poměrně častá, si v MySQL uvědomili a nabídli pro ni efektivní, byť nestandardní řešení. Pokud ale aplikace nemusí pracovat nad více databázemi zároveň, není důvod se mu bránit.


Podobně laděné texty můžete najít i na autorově weblogu PHP triky.

Jakub Vrána

Jakub Vrána

Autor se živí programováním v PHP, podílí se na jeho oficiální dokumentaci, vyučuje ho na MFF UK a vede odborná školení. Poznámky si zapisuje na weblog PHP triky.

Školení: GIT správce zdrojových kódů

 

Seznamte se s možnosti systému správy verzí zdrojových kódů GIT, který používají i vývojáři linuxového jádra.

  • Proč správa verzí
  • Architektura GITu
  • GIT v praxi
  • a další

Podrobnější informace o školení a přihláška

Ohodnoťte jako ve škole:
Průměrná známka 3,19

Přehled názorů

PHP okénko?
Jakub Hegenbart 30. 3. 2005 00:13
Nový
├ 
Re: PHP okénko?
HKMaly 30. 3. 2005 01:22
Nový
│
└ 
Re: PHP okénko?
anonymní uživatel 30. 3. 2005 01:33
Nový
│
 
├ 
Re: PHP okénko?
anonymní uživatel 30. 3. 2005 01:33
Nový
│
 
├ 
Re: PHP okénko?
HKMaly 30. 3. 2005 01:54
Nový
│
 
│
└ 
Re: PHP okénko?
Jakub Hegenbart 30. 3. 2005 02:45
Nový
│
 
│
 
├ 
Re: PHP okénko?
Jakub Hegenbart 30. 3. 2005 02:47
Nový
│
 
│
 
│
├ 
Re: PHP okénko?
Adam Hauner 30. 3. 2005 07:53
Nový
│
 
│
 
│
│
├ 
Re: PHP okénko?
Jakub Hegenbart 30. 3. 2005 09:02
Nový
│
 
│
 
│
│
├ 
Re: PHP okénko?
anonymní uživatel 30. 3. 2005 12:36
Nový
│
 
│
 
│
│
└ 
Re: PHP okénko?
Marabu 30. 3. 2005 12:39
Nový
│
 
│
 
│
├ 
Proboha ja ten scrollovaci zdrojak nepreziju.
mat 30. 3. 2005 08:53
Nový
│
 
│
 
│
├ 
Proboha ja ten scrollovaci zdrojak nepreziju.
mat 30. 3. 2005 08:55
Nový
│
 
│
 
│
└ 
Proboha ja ten scrollovaci zdrojak nepreziju.
mat 30. 3. 2005 08:56
Nový
│
 
│
 
│
 
├ 
Re: Proboha ja ten scrollovaci zdrojak nepreziju.
mat 30. 3. 2005 10:16
Nový
│
 
│
 
│
 
└ 
Re: Proboha ja ten scrollovaci zdrojak nepreziju.
pharook 30. 3. 2005 11:36
Nový
│
 
│
 
├ 
Re: PHP okénko?
Michal Kubeček 30. 3. 2005 11:22
Nový
│
 
│
 
├ 
Re: PHP okénko?
HKMaly 30. 3. 2005 16:15
Nový
│
 
│
 
└ 
Re: PHP okénko?
Satano 30. 3. 2005 23:27
Nový
│
 
│
 
 
├ 
Re: PHP okénko?
martin 31. 3. 2005 08:58
Nový
│
 
│
 
 
│
└ 
Re: PHP okénko?
Satano 1. 4. 2005 21:37
Nový
│
 
│
 
 
│
 
└ 
Re: PHP okénko?
Jakub Hegenbart 1. 4. 2005 23:44
Nový
│
 
│
 
 
└ 
Re: PHP okénko?
Vladimir Kralik 31. 3. 2005 10:49
Nový
│
 
│
 
 
 
├ 
Re: PHP okénko?
HKMaly 31. 3. 2005 19:16
Nový
│
 
│
 
 
 
└ 
Re: PHP okénko?
Jakub Hegenbart 1. 4. 2005 19:36
Nový
│
 
│
 
 
 
 
└ 
Re: PHP okénko?
Vladimir Kralik 4. 4. 2005 09:37
Nový
│
 
│
 
 
 
 
 
└ 
Re: PHP okénko?
Jakub Vrána 4. 4. 2005 12:23
Nový
│
 
└ 
Re: PHP okénko?
Jakub Vrána 30. 3. 2005 08:01
Nový
│
 
 
├ 
Re: PHP okénko?
Jakub Hegenbart 30. 3. 2005 09:04
Nový
│
 
 
│
└ 
Re: PHP okénko?
Jakub Vrána 30. 3. 2005 09:38
Nový
│
 
 
│
 
└ 
Re: PHP okénko?
Jakub Hegenbart 30. 3. 2005 10:48
Nový
│
 
 
├ 
Re: PHP okénko?
Jakub Hegenbart 30. 3. 2005 09:05
Nový
│
 
 
├ 
Re: PHP okénko?
Jakub Hegenbart 30. 3. 2005 09:06
Nový
│
 
 
│
└ 
Re: PHP okénko?
Jakub Hegenbart 30. 3. 2005 09:09
Nový
│
 
 
└ 
Re: PHP okénko?
Michal Kubeček 30. 3. 2005 11:25
Nový
│
 
 
 
└ 
Re: PHP okénko?
Jakub Vrána 30. 3. 2005 11:31
Nový
│
 
 
 
 
└ 
Re: PHP okénko?
Michal Kubeček 30. 3. 2005 22:31
Nový
│
 
 
 
 
 
└ 
Re: PHP okénko?
Jakub Vrána 30. 3. 2005 23:00
Nový
│
 
 
 
 
 
 
└ 
Re: PHP okénko?
Michal Kubeček 30. 3. 2005 23:23
Nový
└ 
Re: PHP okénko?
Satano 30. 3. 2005 23:08
Nový
Preco zistovat pocet riadkov ?
Vladimir Kralik 30. 3. 2005 09:32
Nový
├ 
Re: Preco zistovat pocet riadkov ?
Jakub Vrána 30. 3. 2005 10:02
Nový
│
└ 
Re: Preco zistovat pocet riadkov ?
Vladimir Kralik 30. 3. 2005 11:00
Nový
└ 
Re: Preco zistovat pocet riadkov ?
Jan Mensik 30. 3. 2005 11:20
Nový
 
├ 
Re: Preco zistovat pocet riadkov ?
Vladimir Kralik 30. 3. 2005 12:05
Nový
 
│
└ 
Re: Preco zistovat pocet riadkov ?
Jakub Vrána 30. 3. 2005 12:13
Nový
 
│
 
└ 
Re: Preco zistovat pocet riadkov ?
Vladimir Kralik 30. 3. 2005 12:28
Nový
 
└ 
Re: Preco zistovat pocet riadkov ?
HKMaly 30. 3. 2005 16:20
Nový
Pridanie nalepky
puco 30. 3. 2005 09:55
Nový
└ 
Re: Pridanie nalepky
Jakub Vrána 30. 3. 2005 11:13
Nový
mysql_num_rows
Lampa 30. 3. 2005 12:55
Nový
└ 
Re: mysql_num_rows
... 6. 12. 2005 08:35
Nový
 
└ 
Re: mysql_num_rows
Lampa 6. 12. 2005 09:16
Nový
Zkouska "triku"
Dave 30. 3. 2005 14:51
Nový
└ 
Re: Zkouska "triku"
Marabu 30. 3. 2005 15:46
Nový
 
└ 
Re: Zkouska "triku"
Dave 1. 4. 2005 23:07
Nový
count vseobecne
barney 30. 3. 2005 16:02
Nový
└ 
Re: count vseobecne
Jakub Vrána 30. 3. 2005 16:19
Nový
 
└ 
Re: count vseobecne
Jakub Hegenbart 1. 4. 2005 19:51
Nový
 
 
└ 
Re: count vseobecne
HKMaly 4. 4. 2005 17:03
Nový
       

Tento text je již více než dva měsíce starý. Chcete-li na něj reagovat v diskusi, pravděpodobně vám již nikdo neodpoví. Pro řešení aktuálních problémů doporučujeme využít naše diskusní fórum.

Zasílat nově přidané příspěvky e-mailem