Mafia II

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 ;)

Vložty komentář