Rindu atlase un skaitīšana vienā vaicājumā - SQL_CALC_FOUND_ROWS. Rindu atlase un skaitīšana vienā vaicājumā - SQL_CALC_FOUND_ROWS Funkcijas COUNT() izmantošana ar piemēru

Reiz es saskāros ar šo problēmu, taču daudzi no internetā piedāvātajiem risinājumiem man nederēja. Un tomēr es atradu veidu. Un pat ne vienu.

1. metode: phpMyAdmin

Sāksim ar visvienkāršāko un acīmredzamāko. Pieņemsim, ka jums nav jāizmanto rezultāts kodā, bet vienkārši jānoskaidro rindu skaits, tas arī viss.

Pēc tam mēs ejam uz phpMyAdmin (localhost / tools / phpmyadmin - Denverai), pēc tam atlasiet vajadzīgo datu bāzi, pēc tam atlasiet tabulu, kurā jānosaka rindu skaits, un mēs redzam šādu ziņojumu:

2. metode. SKAITĪT

Lūk, kā izskatās pats SQL vaicājums:

SQL vaicājums ar nosacījumu:

Ieviešana PHP:

Līdzīgi šeit var pievienot nosacījumu. Tad kods parādīs rindu skaitu tabulā, kas atbilst nosacījumam.

3. metode. mysql_num_rows

Piemēram, programmā WordPress ziņas tiek glabātas wp_posts tabulā, lai mēs varētu uzzināt, cik ierakstu (postu) ir saglabāti datu bāzē (MySQL tabulā). Šis kods ir tikai piemērs (vai gadījumiem, kad WordPress nav ielādēts), jo WordPress izveido savienojumu ar datu bāzi, izmantojot .

Rezultātā tiks iekļauti pilnīgi visi rekordi. Un kā uzzināt tikai publicēto skaitu? Lai to izdarītu, mums ir nedaudz jāmaina SQL vaicājums.

No autora: mans draugs apgalvo, ka Ziemassvētku vecītis pastāv. Viņš ticēja viņam pēc tam, kad viņa jaunākajam dēlam Jaunajā gadā tika uzdāvināti 10 kg šokolādes. Tagad nākamgad būs jālūdz Ziemassvētku vecītim pildījumi visiem ģimenes locekļiem! Par laimi, tīmekļa programmēšanā jūs varat to spēlēt droši no šādiem pārsteigumiem un iepriekš noteikt MySQL rindu skaitu.

Kāpēc zināt, cik?

Jebkura tabula sastāv no kolonnām un rindām. Datu bāzē saglabāto datu apjoms ir atkarīgs no tā, cik rindu ir katrā tās tabulā.

Tāpat kā caurumu skaits cilvēka zobos ir atkarīgs no agrāk apēsto saldumu daudzuma. Precīzāk, no kopējā saldumu svara, kas jūsu bērnam tika "uzdāvināts" Jaunajam gadam.

Ir skaidrs, ka liels skaits rindu MySQL datubāzē nepalielinās zīmogus jūsu mutē, taču, neskatoties uz to, zināšanas par šo parametru var būt nepieciešamas, optimizējot vietni, palaistot dažus skriptus utt.

Viegli!

Lai iegūtu MySQL rindu skaitu, nav jābūt "gudram" SQL vaicājumu apkopošanā. Vienkārši programmas apvalkā atveriet vajadzīgo tabulu un apskatiet pēdējās rindas id. Tieši šī kolonna visbiežāk tiek izmantota kā unikāla atslēga, un tās vērtība tiek automātiski ģenerēta (automātiska palielināšana), palielinot vienu (+1) līdz iepriekšējai.

Lai pierādītu šo "aksiomu", atvērsim phpMyAdmin jebkuras datu bāzes tabulu. Piemēram, dzīvnieku galds. Kā redzat ekrānuzņēmumā, id kolonnas vērtība iet secībā, no 1 līdz... Tātad, nolieciet malā! Un kur aizbēga kaķis ar “identifikācijas numuru” 4? Iespējams, atkal "suņi" ar 5. un 6. numuru bija nobijušies

Šajā MySQL datubāzē tabulas rindu skaitu var vienkārši saskaitīt "uz pirkstiem". Bet ja tabulā ir nevis 7 rindas, bet vairāki simti? Piemēram, kā šajā.

Un šī ir tikai viena no astoņām parauga lapām. Faktiski ierakstu skaitu var aprēķināt ne tikai simtos, bet arī tūkstošos. Turklāt nav id kolonnas, jo tā nav obligāta. Tās klātbūtne ir atkarīga no visas datu bāzes struktūras, jo visu tajā esošo rindu vērtības ir savstarpēji saistītas. Izrādās, ka iepriekš aprakstītā MySQL rindu skaitīšanas metode ne vienmēr darbojas.

Dažas pareizas metodes

Kā saka, pirmā metode ir "gabalaina", tāpēc apsvērsim vairākus efektīvākus un mazāk "vienkāršus" veidus:

Funkcija COUNT() atgriež rindu skaitu. Tā ir iebūvēta SQL funkcija. Tomēr no datu bāzes noskaidrosim lielas tabulas ierakstu skaitu, kuras ekrānuzņēmums ir norādīts iepriekš. Pieprasījuma kods:

ATLASĪT SKAITS(*) NO "valsts".

ATLASĪT SKAITS (* ) NO "valsts".

Izrādās, ka valsts tabulā ir pat 239 ieraksti! Skaidrs, ka to saskaitīšanai nepietiks ne pirkstu, ne kāju pirkstu (ja neizmanto citu cilvēku vai dzīvnieku ekstremitātes)). Kā redzat, šī MySQL rindu skaitīšanas metode darbojas daudz precīzāk un tiek izmantota visbiežāk.

Taču šī funkcija sniedz vairāk nekā tikai to! Piemēram, to var izmantot, lai noskaidrotu, cik no datubāzē "pārstāvētajām" valstīm atrodas Eiropā:

Un arī, cik reizes katra valsts ir minēta tabulā. Pieprasījuma piemērs:

ATLASĪT `Vārds` , SKAITĪT(*) NO `valsts` GROUP BY `Vārds

ATLASĪT ` Vārds ` , COUNT (* ) NO ` valsts ` GROUP BY ` Name `

Izmantojot šo vaicājumu, mēs noskaidrojām MySQL rindu skaitu, kurās ir minēta katra valsts. No tā izpildes rezultātiem redzams, ka reiz.

Es gandrīz aizmirsu! Ja jums vēl nav pasaules datu bāzes, ar kuru mēs šodien strādājam, varat to lejupielādēt no šīs saites no MySQL DBVS izstrādātāju oficiālās vietnes. Pēc arhīva lejupielādes ar to tas ir jāizpako un pēc tam jāimportē serveris, kas nav DB serveris. Programmā phpMyAdmin to var izdarīt, izmantojot galvenās izvēlnes vienumu "Importēt".

Par šo procedūru es runāju sīkāk vienā no saviem iepriekšējiem rakstiem.

Funkcija MAX() — dažos gadījumos tā arī ļauj MySQL uzzināt tabulas rindu skaitu. Kāpēc dažreiz? Es tagad paskaidrošu. Atcerieties pirmo skaitīšanas veidu, ko mēs aplūkojām sākumā. Tas nozīmē, ka lielākā id kolonnas vērtība ir vienāda ar ierakstu skaitu. Šīs funkcijas izmantošana ir sava veida šīs metodes "automatizācija". MAX() atgriež norādītās kolonnas (id) maksimālo vērtību. Lai pārbaudītu funkciju, mēs izmantosim pilsētas tabulu, kas arī ir daļa no pasaules datu bāzes. Pieprasījuma kods:

ATLASĪT MAX(`ID`) NO `pilsētas`

IZVĒLĒTIES MAX (`ID`) NO `pilsētas`

Vaicājuma rezultātā mēs ieguvām pēdējās rindas kolonnas vērtību. Izrādās, ka MySQL saskaitīja rindu skaitu.

Ja nepieciešams, pēdējo ierakstu var iegūt pilnībā:

SELECT MAX(`ID`), `nosaukums`, `valsts kods`, `rajons`, `iedzīvotāji` NO `pilsētas'

SELECT MAX (`ID`), `nosaukums`, `valsts kods`, `rajons`, `iedzīvotāji`, NO `pilsētas

Lūdzu, ņemiet vērā, ka atlasei pirms funkcijas izsaukšanas "*" vietā mēs uzskaitām visu kolonnu nosaukumus. Šī ir sintakses funkcija, izmantojot MySQL iebūvētās funkcijas.

Ierakstu skaita noteikšana PHP

Bieži PHP MySQL vietņu kodā ir jāiegūst rindu skaits, lai pēc tam nodotu šo vērtību kā ievades parametru turpmākai apstrādei. To var izdarīt ar šādu kodu:

query("SELECT * FROM `country`")) ( printf("Tabulā ir %d rindas.\n", $rezultāts->rindu_skaits); $rezultāts->close(); ) mysqli_close($con); ?>

Lai noteiktu ierakstu skaitu MySQL tabulā, jāizmanto īpašā COUNT() funkcija.

Funkcija COUNT() atgriež ierakstu skaitu tabulā, kas atbilst norādītajiem kritērijiem.

Funkcija COUNT(expr) vienmēr saskaita tikai tās rindas, kurās izteiksmes vērtība ir NOT NULL .

Izņēmums šim noteikumam ir funkcijas COUNT() izmantošana ar zvaigznīti kā argumentu - COUNT(*) . Šajā gadījumā tiek skaitītas visas rindas neatkarīgi no tā, vai tās ir NULL vai NOT NULL .

Piemēram, funkcija COUNT(*) atgriež kopējo ierakstu skaitu tabulā:

ATLASĪT COUNT(*) NO tabulas_nosaukums

Kā saskaitīt ierakstu skaitu un parādīt

PHP+MySQL koda piemērs kopējā rindu skaita saskaitīšanai un parādīšanai:

$res = mysql_query("SELECT COUNT(*) FROM table_name") $row = mysql_fetch_row($res); $kopā = $rinda; // kopējie ieraksti echo $kopā; ?>

Šis piemērs ilustrē vienkāršāko funkcijas COUNT() izmantošanu. Bet ar šo funkciju jūs varat veikt citus uzdevumus.

Ja konkrēta tabulas kolonna ir norādīta kā parametrs, funkcija COUNT(kolonnas_nosaukums) atgriež ierakstu skaitu šajā kolonnā, kas nesatur nulles vērtību. Ieraksti ar NULL vērtībām tiek ignorēti.

ATLASĪT COUNT(kolonnas_nosaukums) NO tabulas_nosaukums

Funkciju mysql_num_rows() nevar izmantot, jo, lai uzzinātu kopējo ierakstu skaitu, ir jāizpilda SELECT * FROM db vaicājums, tas ir, jāiegūst visi ieraksti, kas nav vēlams, tāpēc vēlams izmantojiet skaitīšanas funkciju.

$rezultāts = mysql_query("SELECT COUNT (*) kā rec FROM db");

Funkcijas COUNT() izmantošana ar piemēru

Šeit ir vēl viens funkcijas COUNT() izmantošanas piemērs. Pieņemsim, ka ir saldējuma galds ar saldējuma katalogu, kurā ir kategoriju ID un saldējuma nosaukumi.

Sākot ar versiju 4.0, MySQL DBVS ir diezgan ērta iespēja saskaitīt visu vaicājumam atbilstošo ierakstu skaitu, ja ierakstu skaits ir ierobežots ar LIMIT. Strādājot ar meklēšanu datu bāzē, kā arī izvēloties no tabulām ar lielu ierakstu skaitu, šāda funkcionalitāte ir vienkārši nepieciešama.

Sintakse. SELECT vaicājumā kolonnu saraksta priekšā ir jābūt opcijai SQL_CALC_FOUND_ROWS. Šeit ir SELECT konstrukcijas sintakses apraksta sākums.

ATLASĪT




select_expr, … …

Tādējādi, izpildot SELECT SQL_CALC_FOUND_ROWS vaicājumu, DBVS saskaitīs kopējo rindu skaitu, kas atbilst vaicājuma nosacījumam, un saglabās šo numuru atmiņā. Protams, vaicājumam SELECT SQL_CALC_FOUND_ROWS ir jēga tikai tad, ja tiek izmantots ierobežojums (LIMIT). Tūlīt pēc atlases vaicājuma izpildes, lai iegūtu ierakstu skaitu, ir jāizpilda vēl viens SELECT vaicājums: SELECT FOUND_ROWS ();. Rezultātā MySQL atgriezīs vienu rindu ar vienu lauku, kurā tiks saglabāts rindu skaits.

Pieprasījumu piemērs:

> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE numurs > 100 LIMIT 10;
> SELECT FOUND_ROWS();

Pirmais vaicājums atgriezīs (parādīs) 10 tabulas tbl_name rindas, kurām ir izpildīts nosacījuma numurs > 100. Otrais komandas SELECT izsaukums atgriezīs rindu skaitu, ko pirmā SELECT komanda būtu atgriezusi, ja tā būtu uzrakstīta. bez LIMIT paziņojuma. Lai gan MySQL ir jāpārrēķina visas rezultātu kopas rindas, izmantojot komandu SELECT SQL_CALC_FOUND_ROWS, šī metode joprojām ir ātrāka nekā bez LIMIT, jo tai nav jānosūta rezultāts klientam.

Pieprasījumu piemēri no PHP:

$rezultāts = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM table1 LIMIT 0, 10", $saite);
while ($row = mysql_fetch_assoc($result))
{
var_dump($rinda);
}

$rezultāts = mysql_query("SELECT FOUND_ROWS()", $saite);
$skaits_rindas = mysql_result($rezultāts, 0);
echo "$num_rows Rows\n";

Koda izpildes rezultātā, ja $link norāda uz atvērtu savienojumu ar DBVS, PHP izdrukās 10 rindas no tabulas tabulas1 un pēc tam vaicājumam atbilstošo rindu skaita veselu skaitļu vērtību (izņemot LIMIT).

UNION vaicājumos SQL_CALC_FOUND_ROWS var darboties divējādi, jo LIMIT var parādīties vairākās vietās. Rindu skaitīšanu var veikt atsevišķiem SELECT vaicājumiem vai visam vaicājumam pēc pievienošanās.

SQL_CALC_FOUND_ROWS for UNION mērķis ir nodrošināt, ka tai jāatgriež rindu skaits, kas tiks atgriezts bez globālā LIMIT. Tālāk ir norādīti nosacījumi SQL_CALC_FOUND_ROWS izmantošanai ar UNION:

  • Atslēgvārds SQL_CALC_FOUND_ROWS ir jānorāda pirmajā SELECT priekšrakstā.
  • FOUND_ROWS() vērtība būs precīza tikai tad, ja tiek izmantota UNION ALL. Ja UNION ir norādīts bez ALL, dublikāti tiek izslēgti un FOUND_ROWS() ir tikai aptuvens rādītājs.
  • Ja UNION nav LIMIT, SQL_CALC_FOUND_ROWS tiek ignorēts un tiek atgriezts rindu skaits pagaidu tabulā, kas izveidota, lai izpildītu UNION.