Jeden dotaz a dost ! (SQL LIMIT a počet řádků)
Červen 5th, 2008
Pokud děláte výpis čehokoli, vždycky se setkáte s problémem, jak dělat stránkování. Někdo použije dva dotazy (jedním selectne všechno a udělá na tom COUNT()), někdo použije dva dotazy A v jednom SQL_CALC_FOUND_ROWS a v druhém FOUND_ROWS()). Já jsem použil druhý způsob s tím, že jsem to spojil do jediného SQL dotazu.
Původní myšlenku vymyslel chrisdberry82 at gmail dot com a napsal jí do poznámek k PHP manuálu (mysql_num_rows()). Já jsem jeho nápad vzal a dovedl k (myslím) dokonalosti.
<?php
$sql = "
SELECT SQL_CALC_FOUND_ROWS
'0', z.id
FROM
zoom AS z
LIMIT
0,6
UNION
SELECT
'1', FOUND_ROWS()
ORDER BY `0` DESC , RAND()";
?>
SQL_CALC_FOUND_ROWS zajistí, že se spočítá počet řádků, které by SELECT vrátil bez LIMITU. Pomocí UNION spojíme dotaz s výsledkem. ‚0‘ v prvním selectu je „dummy“ podle kterého budeme řadit. V druhém dotazu je „1“. Nakonec celou QUERY seřadíme nejdříve podle dummy sloupce opačně – tedy tak, že počet řádků je na prvním místě (důležité dále) a potom můžeme použít libovolné další řazení.
Potom vytahneme výsledek takto:
<?php
$res = mysql_query($sql);
$count = mysql_fetch_assoc($res);
while($row = mysql_fetch_assoc($res)){
unset($row["0"]); //zrušme dummy sloupec
print_r($row); //nebo cokoli ;)
}
echo $count["id"]; // A tohle vrácí celkový počet řádek ;)
?>
Čímžto sem se zbavil nehezkých konstrukcí s IFy v původním nápadu ;)
Home