Mysql numărarea numărului de înregistrări dintr-un tabel. Selectarea și numărarea rândurilor într-o singură interogare - SQL_CALC_FOUND_ROWS

De la autor: unul dintre prietenii mei susține că Moș Crăciun există. A crezut în el după ce fiului său cel mic a primit 10 kg de ciocolată de Anul Nou. Acum anul viitor va trebui să-i cerem lui Moș Crăciun umpluturi pentru toți membrii familiei! Din fericire, în programarea web puteți juca în siguranță împotriva unor astfel de surprize și puteți determina în avans numărul de rânduri din MySQL.

De ce știi cât?

Orice tabel este format din coloane și rânduri. Cantitatea stocată în baza de date depinde de câte rânduri sunt conținute în fiecare dintre tabelele acesteia.

La fel cum numărul de găuri din dinții unei persoane depinde de cantitatea de bomboane consumată anterior. Mai exact, din greutatea totală a dulciurilor care au fost „dăruite” copilului tău pentru Anul Nou.

Este clar că un număr mare de rânduri din baza de date MySQL nu va adăuga umpluturi în gură, dar totuși, cunoașterea acestui parametru poate fi necesară atunci când optimizați funcționarea site-ului dvs., pentru a rula niște scripturi etc.

Uşor!

Pentru a obține numărul de rânduri în MySQL, nu trebuie să fiți inteligent în compunerea interogărilor SQL. Este suficient doar să deschideți tabelul dorit în shell-ul programului și să vă uitați la id-ul ultimului rând. Această coloană este cea mai des folosită ca o cheie unică, iar valoarea ei este generată automat (incrementare automată) prin creșterea cu unu (+1) la cea anterioară.

Pentru a demonstra această „axiomă”, să deschidem un tabel în orice bază de date din phpMyAdmin. De exemplu, animalul de masă. După cum puteți vedea în captură de ecran, valoarea coloanei id merge în ordine, de la 1 la... Deci, lăsați-o deoparte! Unde a fugit pisica cu „număr de identificare” 4? Probabil că s-a speriat din nou de „câinii” numărul 5 și 6

În această bază de date MySQL, puteți număra pur și simplu numărul de rânduri dintr-un tabel „pe degete”. Dar dacă tabelul nu are 7 rânduri, ci câteva sute? De exemplu, ca în aceasta.

Și aceasta este doar una dintre cele opt pagini de exemplu. De fapt, numărul de înregistrări poate fi numărat nu numai în sute, ci și în mii. În plus, nu există nicio coloană ID deoarece este opțională. Prezența sa depinde de structura întregii baze de date, deoarece în ea valorile tuturor rândurilor sunt interconectate. Se pare că metoda de numărare a rândurilor MySQL descrisă mai sus nu funcționează întotdeauna.

Mai multe metode corecte

După cum se spune, prima metodă este noduloasă, așa că să ne uităm la câteva metode mai eficiente și mai puțin „simple”:

Funcția COUNT() – returnează numărul de rânduri. Este o funcție SQL încorporată. Totuși, să aflăm numărul de înregistrări ale unui tabel mare din baza de date, a cărei captură de ecran este dată mai sus. Cod cerere:

SELECTAȚI COUNT(*) DIN „țară”.

SELECTAȚI NUMĂRUL (*) DIN „țară”.

Se dovedește că în tabelul țărilor sunt până la 239 de înregistrări! Este clar că nu sunt suficiente degete de la mâini sau de la picioare pentru a le număra (cu excepția cazului în care folosești membrele altor persoane sau animale)). După cum puteți vedea, această metodă de numărare a numărului de rânduri în MySQL funcționează mult mai precis și este cel mai des folosită.

Dar această funcție face mai mult decât atât! De exemplu, îl puteți folosi pentru a afla câte dintre țările „reprezentate” în baza de date sunt în Europa:

Și, de asemenea, de câte ori este menționată fiecare țară în tabel. Exemplu de solicitare:

SELECTAȚI `Nume` , COUNT(*) DIN `țara` GROUP BY `Nume`

SELECTAȚI ` Nume ` , NUMĂRĂ (* ) DIN ` țara ` GROUP BY ` Nume `

Folosind această interogare, am aflat numărul de rânduri din MySQL care menționează fiecare țară. Din rezultatele executării sale reiese clar că o dată la un moment dat.

Aproape am uitat! Dacă nu aveți încă baza de date mondială, cu care lucrăm astăzi, atunci o puteți descărca de pe acest link de pe site-ul oficial al dezvoltatorilor DBMS MySQL. După descărcarea arhivei cu ea, trebuie să o dezarhivați și apoi să o importați de pe serverul bazei de date. În phpMyAdmin, acest lucru se poate face prin elementul din meniul principal „Import”.

Despre această procedură am vorbit mai detaliat într-unul dintre materialele anterioare.

Funcția MAX() - în unele cazuri, permite și MySQL să afle numărul de rânduri dintr-un tabel. De ce uneori? Voi explica acum. Amintiți-vă de prima metodă de numărare la care ne-am uitat la început. Aceasta implică faptul că cea mai mare valoare a coloanei id este egală cu numărul de înregistrări. Utilizarea acestei funcții este un fel de „automatizare” a acelei metode. MAX() returnează valoarea maximă a coloanei specificate (id). Pentru a testa funcția, vom folosi tabelul oraș, care face parte și din baza de date mondială. Cod cerere:

SELECTAȚI MAX(`ID`) DIN `oraș`

SELECTAȚI MAX (`ID`) DIN `oraș`

În urma interogării, am primit valoarea coloanei ultimului rând. Se pare că MySQL a numărat numărul de rânduri.

Dacă este necesar, puteți obține ultima înregistrare în întregime:

SELECTAȚI MAX(`ID`),`Nume`,`Cod țară`,`District`,`Populație` FROM `oraș`

SELECT MAX (`ID`), `Nume`, `CountryCode`, `District`, `Populație` FROM `city`

Vă rugăm să rețineți că pentru selectare, înainte de a apela funcția, în loc de „*” listăm numele tuturor coloanelor. Aceasta este o caracteristică de sintaxă atunci când utilizați funcții încorporate în MySQL.

Determinarea numărului de înregistrări în PHP

Adesea, în codul site-urilor PHP MySQL, numărul de rânduri trebuie să fie obținut pentru a trece apoi această valoare ca parametru de intrare pentru procesarea ulterioară. Acest lucru se poate face cu următorul cod:

query("SELECT * FROM `country`")) ( printf("Tabelul are %d rânduri.\n", $result->num_rows); $result->close(); ) mysqli_close($con); ?>

Pentru a determina numărul de înregistrări dintr-un tabel MySQL, trebuie să utilizați funcția specială COUNT().

Funcția COUNT() returnează numărul de înregistrări dintr-un tabel care corespund unui criteriu dat.

Funcția COUNT(expr) numără întotdeauna numai acele rânduri pentru care rezultatul expr NU este NULL.

Excepția de la această regulă este atunci când se utilizează funcția COUNT() cu un asterisc ca argument - COUNT(*) . În acest caz, toate rândurile sunt numărate, indiferent dacă sunt NULL sau NOT NULL.

De exemplu, funcția COUNT(*) returnează numărul total de înregistrări din tabel:

SELECTAȚI COUNT(*) FROM table_name

Cum să numărați numărul de înregistrări și să le afișați pe ecran

Exemplu de cod PHP+MySQL pentru numărarea și afișarea numărului total de rânduri:

$res = mysql_query("SELECT COUNT(*) FROM table_name") $row = mysql_fetch_row($res); $total = $rând; // total records echo $total; ?>

Acest exemplu ilustrează cea mai simplă utilizare a funcției COUNT(). Dar puteți efectua și alte sarcini folosind această funcție.

Specificând o anumită coloană de tabel ca parametru, funcția COUNT(nume_coloană) returnează numărul de înregistrări din acea coloană care nu conțin o valoare NULL. Înregistrările cu valori NULL sunt ignorate.

SELECTAȚI COUNT(nume_coloană) FROM nume_tabel

Funcția mysql_num_rows() nu poate fi folosită deoarece pentru a afla numărul total de înregistrări, trebuie să rulați o interogare SELECT * FROM db, adică să obțineți toate înregistrările, iar acest lucru nu este de dorit, deci este de preferat să utilizați funcția de numărare.

$rezultat = mysql_query("SELECT COUNT (*) ca rec FROM db");

Folosind funcția COUNT() ca exemplu

Iată un alt exemplu de utilizare a funcției COUNT(). Să presupunem că există o masă ice_cream cu un catalog de înghețată, care conține identificatori de categorii și nume de înghețată.

Începând cu versiunea 4.0, SGBD-ul MySQL are o capacitate destul de convenabilă de a număra numărul tuturor înregistrărilor care se potrivesc cu o interogare, atunci când numărul de înregistrări este limitat cu LIMIT. Când lucrați cu căutări în baze de date, precum și atunci când selectați din tabele cu un număr mare de înregistrări, o astfel de funcționalitate este pur și simplu necesară.

Sintaxă. Într-o interogare SELECT, trebuie să specificați opțiunea SQL_CALC_FOUND_ROWS înaintea listei de coloane. Iată începutul sintaxei SELECT.

SELECTAȚI




select_expr, … …

Astfel, la executarea interogării SELECT SQL_CALC_FOUND_ROWS, DBMS va număra numărul total de rânduri care se potrivesc cu condiția de interogare și va stoca acest număr în memorie. Desigur, interogarea SELECT SQL_CALC_FOUND_ROWS are sens numai atunci când se utilizează o limită (LIMIT). Imediat după executarea interogării de selecție, pentru a obține numărul de înregistrări, trebuie să executați o altă interogare SELECT: SELECT FOUND_ROWS ();. Ca rezultat, MySQL va returna un rând cu un câmp în care va fi stocat numărul de rânduri.

Un exemplu de interogări în sine:

> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE număr > 100 LIMIT 10;
> SELECTAȚI FOUND_ROWS();

Prima interogare va returna (ieșire) 10 rânduri din tabelul nume_tbl pentru care numărul condiției > 100 este adevărat. Al doilea apel la comanda SELECT va returna numărul de rânduri pe care prima comandă SELECT le-ar fi returnat dacă ar fi fost scrisă fără. expresia LIMIT. Deși utilizarea comenzii SELECT SQL_CALC_FOUND_ROWS necesită ca MySQL să recalculeze toate rândurile din setul de rezultate, este totuși mai rapidă decât fără LIMIT deoarece nu trebuie să trimită rezultatul către client.

Exemple de cereri de la PHP:

$rezultat = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM table1 LIMIT 0, 10″, $link);
while ($rând = mysql_fetch_assoc($rezultat))
{
var_dump($rând);
}

$rezultat = mysql_query("SELECT FOUND_ROWS()", $link);
$num_rows = mysql_result($rezultat, 0);
echo „$num_rows Rânduri\n”;

Ca rezultat al executării codului, cu condiția ca $link să indice o conexiune deschisă la SGBD, PHP va imprima 10 rânduri din tabelul table1 și apoi o valoare întreagă a numărului de rânduri care se potrivesc cu interogarea (ignorând LIMIT).

În interogările UNION, SQL_CALC_FOUND_ROWS se poate comporta în două moduri datorită faptului că LIMIT poate apărea în mai multe locuri. Numărarea rândurilor se poate face pentru interogări SELECT individuale sau pentru întreaga interogare după îmbinare.

Scopul SQL_CALC_FOUND_ROWS pentru UNION este ca acesta să returneze numărul de rânduri care ar fi returnat fără o LIMITĂ globală. Condițiile pentru utilizarea SQL_CALC_FOUND_ROWS cu UNION sunt enumerate mai jos:

  • Cuvântul cheie SQL_CALC_FOUND_ROWS trebuie specificat în prima instrucțiune SELECT.
  • Valoarea lui FOUND_ROWS() va fi exactă numai dacă este folosit UNION ALL. Dacă se specifică UNION fără ALL, are loc eliminarea dublelor, iar valoarea FOUND_ROWS() va fi doar aproximativă.
  • Dacă LIMIT nu este prezent în UNION, atunci SQL_CALC_FOUND_ROWS este ignorat și numărul de rânduri din tabelul temporar care este creat pentru a executa UNION este returnat.
Să ne amintim ce mesaje și în ce subiecte avem. Pentru a face acest lucru, puteți utiliza interogarea obișnuită:

Dacă ar trebui doar să aflăm câte mesaje sunt pe forum. Pentru a face acest lucru, puteți utiliza funcția încorporată NUMARA(). Această funcție numără numărul de rânduri. În plus, dacă * este folosit ca argument pentru această funcție, atunci toate rândurile tabelului sunt numărate. Și dacă un nume de coloană este specificat ca argument, atunci sunt numărate numai acele rânduri care au o valoare în coloana specificată.

În exemplul nostru, ambele argumente vor da același rezultat, deoarece toate coloanele din tabel NU sunt NULL. Să scriem o interogare folosind coloana id_topic ca argument:

SELECTAȚI COUNT(id_topic) FROM postări;

Deci, există 4 mesaje în subiectele noastre. Dar dacă vrem să știm câte mesaje există în fiecare subiect. Pentru a face acest lucru, va trebui să ne grupăm mesajele după subiect și să calculăm numărul de mesaje pentru fiecare grup. Pentru a grupa în SQL, utilizați operatorul A SE GRUPA CU. Solicitarea noastră va arăta acum astfel:

SELECTează id_topic, COUNT(id_topic) FROM postări GROUP BY id_topic;

Operator A SE GRUPA CU spune SGBD să grupeze datele după coloana id_topic (adică, fiecare subiect este un grup separat) și să numere numărul de rânduri pentru fiecare grup:

Ei bine, in topicul cu id=1 avem 3 mesaje, iar cu id=4 - unul. Apropo, dacă valorile lipsă ar fi posibile în câmpul id_topic, atunci astfel de rânduri ar fi combinate într-un grup separat cu valoarea NULL.

Să presupunem că ne interesează doar acele grupuri care au mai mult de două mesaje. Într-o interogare normală, vom specifica condiția folosind operatorul UNDE, dar acest operator poate lucra doar cu șiruri, iar pentru grupuri aceleași funcții sunt îndeplinite de operator AVÂND:

SELECTează id_topic, COUNT(id_topic) FROM postări GROUP BY id_topic HAVING COUNT(id_topic) > 2;

Ca rezultat avem:

ÎN lecția 4 ne-am uitat la ce condiții pot fi stabilite de către operator UNDE, aceleasi conditii pot fi stabilite de catre operator AVÂND, trebuie doar să-ți amintești asta UNDE filtrează șiruri și AVÂND- grupuri.

Așa că astăzi am învățat cum să creăm grupuri și cum să numărăm numărul de rânduri dintr-un tabel și în grupuri. În general, împreună cu operatorul A SE GRUPA CU Există și alte funcții încorporate care pot fi folosite, dar le vom studia mai târziu.