Mysql počítající počet záznamů v tabulce. Výběr a počítání řádků v jednom dotazu - SQL_CALC_FOUND_ROWS

Od autora: jeden z mých přátel tvrdí, že Santa Claus existuje. Uvěřil mu poté, co jeho nejmladší syn dostal na Nový rok 10 kg čokolád. Nyní příští rok budeme muset požádat Ježíška o náplně pro všechny členy rodiny! Naštěstí ve webovém programování můžete proti takovým překvapením hrát na jistotu a předem určit počet řádků v MySQL.

Proč vědět kolik?

Každá tabulka se skládá ze sloupců a řádků. Množství uložené v databázi závisí na tom, kolik řádků je obsaženo v každé z jejích tabulek.

Stejně jako počet děr v zubech člověka závisí na množství dříve snědeného cukroví. Přesněji z celkové hmotnosti sladkostí, které byly vašemu dítěti „darovány“ na Nový rok.

Je jasné, že velké množství řádků v databázi MySQL vám nebude přidávat výplně do úst, ale přesto může být znalost tohoto parametru potřeba při optimalizaci provozu vašeho webu, pro spouštění některých skriptů apod.

Snadno!

Chcete-li získat počet řádků v MySQL, nemusíte být chytří při skládání SQL dotazů. Jednoduše otevřete požadovanou tabulku v shellu programu a podívejte se na id posledního řádku. Právě tento sloupec se nejčastěji používá jako unikátní klíč a jeho hodnota se generuje automaticky (automatický přírůstek) inkrementací o jedničku (+1) k předchozímu.

Abychom dokázali tento „axiom“, otevřeme tabulku v jakékoli databázi v phpMyAdmin. Například stolní zvíře. Jak můžete vidět na snímku obrazovky, hodnota ve sloupci id jde v pořadí, od 1 do... Takže ji odložte! Kam kočka s „identifikačním číslem“ 4 utekla? Pravděpodobně se opět bál „psů“ číslo 5 a 6

V této databázi MySQL můžete jednoduše spočítat počet řádků v tabulce „na prstech“. Ale co když tabulka nemá 7 řádků, ale několik set? Například jako v tomto.

A to je jen jedna z osmi vzorových stránek. Ve skutečnosti lze počet záznamů počítat nejen na stovky, ale i tisíce. Navíc zde není sloupec id, protože je volitelný. Jeho přítomnost závisí na struktuře celé databáze, protože v ní jsou hodnoty všech řádků propojeny. Ukazuje se, že výše popsaná metoda počítání řádků MySQL nefunguje vždy.

Několik správných metod

Jak se říká, první metoda je hrudkující, takže se podívejme na několik účinnějších a méně „jednoduchých“ metod:

Funkce COUNT() – vrací počet řádků. Je vestavěná funkce SQL. Přesto zjistíme počet záznamů velké tabulky z databáze, jejíž screenshot je uveden výše. Požadovat kód:

VYBERTE POČET (*) Z „země“.

VYBERTE POČET (*) Z „země“.

Ukazuje se, že v tabulce zemí je až 239 záznamů! Je jasné, že na jejich spočítání není dost prstů na rukou nebo nohou (pokud nepoužíváte končetiny jiných lidí nebo zvířat)). Jak vidíte, tento způsob počítání počtu řádků v MySQL funguje mnohem přesněji a je nejčastěji používán.

Ale tato funkce umí víc než jen to! Můžete jej použít například ke zjištění, kolik zemí „zastoupených“ v databázi je v Evropě:

A také kolikrát je každá země uvedena v tabulce. Příklad požadavku:

VYBERTE `Název` , COUNT(*) FROM `země` GROUP BY `Název`

SELECT ` Name ` , COUNT (*) FROM ` country ` GROUP BY ` Name `

Pomocí tohoto dotazu jsme zjistili počet řádků v MySQL, které zmiňují jednotlivé země. Z výsledků jeho provedení je zřejmé, že jedenkrát.

Málem jsem zapomněl! Pokud ještě nemáte světovou databázi, se kterou dnes pracujeme, můžete si ji stáhnout z tohoto odkazu z oficiálních stránek vývojářů MySQL DBMS. Po stažení archivu s ním je třeba jej rozbalit a poté importovat z databázového serveru. V phpMyAdmin to lze provést prostřednictvím položky hlavního menu „Importovat“.

O tomto postupu jsem mluvil podrobněji v jednom z předchozích materiálů.

Funkce MAX() - v některých případech také umožňuje MySQL zjistit počet řádků v tabulce. Proč někdy? Teď to vysvětlím. Vzpomeňte si na první metodu počítání, na kterou jsme se podívali na začátku. To znamená, že největší hodnota ve sloupci id se rovná počtu záznamů. Použití této funkce je jakousi „automatizací“ této metody. MAX() vrací maximální hodnotu zadaného sloupce (id). K otestování funkce použijeme tabulku měst, která je také součástí světové databáze. Požadovat kód:

VYBERTE MAX(`ID`) Z `města`

VYBERTE MAX (`ID`) Z `města`

V důsledku dotazu jsme obdrželi hodnotu sloupce posledního řádku. Ukázalo se, že MySQL spočítal počet řádků.

V případě potřeby můžete získat poslední záznam celý:

SELECT MAX(`ID`),`Název`,`CountryCode`,`District`,`Population` FROM `city`

SELECT MAX (`ID`), `Název`, `CountryCode`, `District`, `Population` FROM `city`

Upozorňujeme, že pro výběr před voláním funkce místo „*“ uvádíme názvy všech sloupců. Toto je funkce syntaxe při použití vestavěných funkcí v MySQL.

Určení počtu záznamů v PHP

Často je v kódu PHP MySQL stránek potřeba získat počet řádků, aby se pak tato hodnota předala jako vstupní parametr pro další zpracování. To lze provést pomocí následujícího kódu:

query("SELECT * FROM `země`")) ( printf("Tabulka má %d řádků.\n", $result->num_rows); $result->close(); ) mysqli_close($con); ?>

Chcete-li zjistit počet záznamů v tabulce MySQL, musíte použít speciální funkci COUNT().

Funkce COUNT() vrací počet záznamů v tabulce, které odpovídají danému kritériu.

Funkce COUNT(výraz) počítá vždy pouze ty řádky, pro které výsledek výrazu NENÍ NULL .

Výjimkou z tohoto pravidla je použití funkce COUNT() s hvězdičkou jako argumentem - COUNT(*) . V tomto případě se počítají všechny řádky bez ohledu na to, zda jsou NULL nebo NOT NULL.

Například funkce COUNT(*) vrátí celkový počet záznamů v tabulce:

SELECT COUNT(*) FROM název_tabulky

Jak spočítat počet záznamů a zobrazit je na obrazovce

Příklad PHP+MySQL kódu pro počítání a zobrazení celkového počtu řádků:

$res = mysql_query("SELECT COUNT(*) FROM table_name") $row = mysql_fetch_row($res); $celkem = $řádek; // celkové záznamy echo $total; ?>

Tento příklad ukazuje nejjednodušší použití funkce COUNT(). Pomocí této funkce však můžete provádět i jiné úkoly.

Zadáním konkrétního sloupce tabulky jako parametru vrátí funkce COUNT(název_sloupce) počet záznamů v tomto sloupci, které neobsahují hodnotu NULL. Záznamy s hodnotami NULL jsou ignorovány.

SELECT COUNT(název_sloupce) FROM název_tabulky

Funkci mysql_num_rows() nelze použít, protože pro zjištění celkového počtu záznamů je třeba spustit dotaz SELECT * FROM db, tedy získat všechny záznamy, a to není žádoucí, proto je vhodnější použijte funkci počítání.

$vysledek = mysql_query("VYBRAT POCET (*) jako rec FROM db");

Použití funkce COUNT() jako příklad

Zde je další příklad použití funkce COUNT(). Řekněme, že existuje tabulka ice_cream s katalogem zmrzliny, který obsahuje identifikátory kategorií a názvy zmrzlin.

Počínaje verzí 4.0 má MySQL DBMS poměrně pohodlnou schopnost spočítat počet všech záznamů, které odpovídají dotazu, když je počet záznamů omezen LIMIT. Při práci s databázovým vyhledáváním i při výběru z tabulek s velkým počtem záznamů je taková funkcionalita prostě nezbytná.

Syntax. V dotazu SELECT musíte před seznamem sloupců zadat volbu SQL_CALC_FOUND_ROWS. Zde je začátek syntaxe SELECT.

VYBRAT




select_expr, … …

Při provádění dotazu SELECT SQL_CALC_FOUND_ROWS tedy DBMS spočítá celkový počet řádků, které odpovídají podmínce dotazu, a uloží tento počet do paměti. Dotaz SELECT SQL_CALC_FOUND_ROWS má přirozeně smysl pouze při použití limitu (LIMIT). Ihned po provedení výběrového dotazu, abyste získali počet záznamů, musíte provést další SELECT dotaz: SELECT FOUND_ROWS ();. Výsledkem je, že MySQL vrátí jeden řádek s jedním polem, ve kterém bude uložen počet řádků.

Příklad samotných žádostí:

> SELECT SQL_CALC_FOUND_ROWS * FROM název_tbl WHERE číslo > 100 LIMIT 10;
> SELECT FOUND_ROWS();

První dotaz vrátí (výstup) 10 řádků tabulky tbl_name, pro které platí číslo podmínky > 100. Druhé volání příkazu SELECT vrátí počet řádků, které by vrátil první příkaz SELECT, kdyby byl zapsán bez. výraz LIMIT. Přestože použití příkazu SELECT SQL_CALC_FOUND_ROWS vyžaduje, aby MySQL přepočítala všechny řádky ve výsledkové sadě, je stále rychlejší než bez LIMIT, protože nemusí odesílat výsledek klientovi.

Příklady požadavků z PHP:

$result = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM table1 LIMIT 0, 10″, $link);
while ($row = mysql_fetch_assoc($result))
{
var_dump($řádek);
}

$vysledek = mysql_query("SELECT FOUND_ROWS()", $odkaz);
$num_rows = mysql_result($vysledek, 0);
echo "$num_rows Řádků\n";

V důsledku provedení kódu, za předpokladu, že $link ukazuje na otevřené připojení k DBMS, PHP vytiskne 10 řádků z tabulky table1 a poté celočíselnou hodnotu počtu řádků, které odpovídají dotazu (ignoruje LIMIT).

V dotazech UNION se SQL_CALC_FOUND_ROWS může chovat dvěma způsoby, protože LIMIT se může objevit na více místech. Počty řádků lze uchovávat pro jednotlivé SELECT dotazy nebo pro celý dotaz po sloučení.

Účelem SQL_CALC_FOUND_ROWS pro UNION je, že by měl vrátit počet řádků, které by byly vráceny bez globálního LIMIT. Podmínky pro použití SQL_CALC_FOUND_ROWS s UNION jsou uvedeny níže:

  • Klíčové slovo SQL_CALC_FOUND_ROWS musí být zadáno v prvním příkazu SELECT.
  • Hodnota FOUND_ROWS() bude přesná pouze při použití UNION ALL. Pokud je zadán UNION bez ALL, dojde k odstranění duplicit a hodnota FOUND_ROWS() bude pouze přibližná.
  • Pokud LIMIT není přítomen v UNION, pak SQL_CALC_FOUND_ROWS je ignorován a je vrácen počet řádků v dočasné tabulce, která je vytvořena pro provedení UNION.
Připomeňme si, jaké zprávy a v jakých tématech máme. Chcete-li to provést, můžete použít obvyklý dotaz:

Co když jen potřebujeme zjistit, kolik zpráv je na fóru. K tomu můžete použít vestavěnou funkci POČET(). Tato funkce počítá počet řádků. Navíc, pokud je jako argument této funkce použit *, pak se počítají všechny řádky tabulky. A pokud je jako argument zadán název sloupce, pak se počítají pouze ty řádky, které mají v zadaném sloupci hodnotu.

V našem příkladu oba argumenty dají stejný výsledek, protože všechny sloupce tabulky NEJSOU NULL. Napišme dotaz pomocí sloupce id_topic jako argumentu:

SELECT COUNT(id_topic) FROM příspěvků;

V našich tématech jsou tedy 4 zprávy. Ale co když chceme vědět, kolik zpráv je v každém tématu. K tomu budeme muset seskupit naše zprávy podle tématu a vypočítat počet zpráv pro každou skupinu. Chcete-li seskupit v SQL, použijte operátor SKUPINA VYTVOŘENÁ. Naše žádost bude nyní vypadat takto:

SELECT id_topic, COUNT(id_topic) FROM příspěvků GROUP BY id_topic;

Operátor SKUPINA VYTVOŘENÁříká DBMS, aby seskupil data podle sloupce id_topic (tj. každé téma je samostatná skupina) a spočítal počet řádků pro každou skupinu:

No, v tématu s id=1 máme 3 zprávy a s id=4 - jednu. Mimochodem, pokud by byly možné chybějící hodnoty v poli id_topic, pak by takové řádky byly sloučeny do samostatné skupiny s hodnotou NULL.

Předpokládejme, že nás zajímají pouze ty skupiny, které mají více než dvě zprávy. V běžném dotazu bychom podmínku specifikovali pomocí operátoru KDE, ale tento operátor může pracovat pouze s řetězci a pro skupiny provádí stejné funkce operátor MÍT:

SELECT id_topic, COUNT(id_topic) FROM příspěvků GROUP BY id_topic HAVING COUNT(id_topic) > 2;

V důsledku toho máme:

V lekce 4 jsme se podívali, jaké podmínky může operátor nastavit KDE, stejné podmínky může stanovit provozovatel MÍT, jen si to musíte zapamatovat KDE filtruje řetězce a MÍT- skupiny.

Dnes jsme se tedy naučili, jak vytvářet skupiny a jak počítat počet řádků v tabulce a ve skupinách. Obecně spolu s operátorem SKUPINA VYTVOŘENÁ Můžete použít další vestavěné funkce, ale budeme je studovat později.