Mysql брой редове с условие. Избиране и преброяване на редове в една заявка - SQL_CALC_FOUND_ROWS

От автора:един мой приятел твърди, че Дядо Коледа съществува. Той му повярва, след като на малкия му син подариха 10 кг шоколадови бонбони за Нова година. Сега следващата година ще трябва да поискаме от Дядо Коледа пълнежи за всички членове на семейството! За щастие, в уеб програмирането можете да играете безопасно срещу подобни изненади и да определите броя на редовете в MySQL предварително.

Защо да знаем колко?

Всяка таблица се състои от колони и редове. Сумата, съхранявана в базата данни, зависи от това колко реда се съдържат във всяка от нейните таблици.

Точно както броят на дупките в зъбите на човек зависи от количеството бонбони, изядени преди това. По-точно от общото тегло на сладките, които са били „подарени“ на вашето дете за Нова година.

Ясно е, че голям брой редове в базата данни MySQL няма да добавят пълнежи в устата ви, но все пак познаването на този параметър може да е необходимо при оптимизиране на работата на вашия сайт, за стартиране на някои скриптове и т.н.

Лесно!

За да получите броя на редовете в MySQL, не е нужно да сте умни в съставянето на SQL заявки. Просто отворете желаната таблица в обвивката на програмата и погледнете идентификатора на последния ред. Именно тази колона най-често се използва като уникален ключ, като нейната стойност се генерира автоматично (автоматично нарастване) чрез увеличаване с единица (+1) към предходната.

За да докажем тази „аксиома“, нека отворим таблица във всяка база данни в phpMyAdmin. Например трапезното животно. Както можете да видите на екранната снимка, стойността на колоната id върви в ред, от 1 до... Така че, оставете я настрана! Къде избяга котката с „идентификационен номер“ 4? Вероятно отново се е уплашил от „кучетата“ номер 5 и 6

В тази база данни MySQL можете просто да преброите броя на редовете в таблица „на пръстите си“. Но какво ще стане, ако таблицата няма 7 реда, а няколкостотин? Например, като в този.

И това е само една от осем примерни страници. Всъщност броят на записите може да се брои не само в стотици, но и в хиляди. Освен това няма колона за id, защото не е задължителна. Неговото присъствие зависи от структурата на цялата база данни, тъй като в нея стойностите на всички редове са взаимосвързани. Оказва се, че методът за броене на редове в MySQL, описан по-горе, не винаги работи.

Няколко правилни метода

Както се казва, първият метод е груб, така че нека разгледаме няколко по-ефективни и по-малко „прости“ метода:

Функция COUNT() – връща броя на редовете. Е вградена SQL функция. И все пак, нека разберем броя на записите на голяма таблица от базата данни, екранната снимка на която е дадена по-горе. Изискван код:

SELECT COUNT(*) FROM `country`

ИЗБЕРЕТЕ БРОЯ (*) ОТ `държава`

Оказва се, че в таблицата на страната има цели 239 записа! Ясно е, че няма достатъчно пръсти на ръцете или краката, за да ги преброите (освен ако не използвате крайниците на други хора или животни)). Както можете да видите, този метод за преброяване на броя на редовете в MySQL работи много по-точно и се използва най-често.

Но тази функция прави повече от това! Например, можете да го използвате, за да разберете колко от държавите, „представени“ в базата данни, са в Европа:

А също и колко пъти всяка държава е спомената в таблицата. Примерна заявка:

ИЗБЕРЕТЕ `Име` , БРОЙ(*) ОТ `държава` ГРУПИРАНЕ ПО `Име`

ИЗБЕРЕТЕ ` Име ` , БРОЙ (* ) ОТ ` държава ` ГРУПИРАНЕ ПО ` Име `

Използвайки тази заявка, открихме броя на редовете в MySQL, които споменават всяка страна. От резултатите от изпълнението му става ясно, че един път.

Почти забравих! Ако все още нямате световната база данни, с която работим днес, можете да я изтеглите от тази връзка от официалния уебсайт на разработчиците на MySQL DBMS. След като изтеглите архива с него, трябва да го разархивирате и след това да го импортирате от сървъра на базата данни. В phpMyAdmin това може да стане чрез елемента от главното меню „Импортиране“.

Говорих за тази процедура по-подробно в един от предишните материали.

Функция MAX() - в някои случаи тя също така позволява на MySQL да открие броя на редовете в таблица. Защо понякога? Сега ще обясня. Спомнете си първия метод за броене, който разгледахме в началото. Това означава, че най-голямата стойност на колоната id е равна на броя на записите. Използването на тази функция е един вид „автоматизация“ на този метод. MAX() връща максималната стойност на посочената колона (id). За тестване на функцията ще използваме градската таблица, която също е част от световната база данни. Изискван код:

SELECT MAX(`ID`) FROM `city`

ИЗБЕРЕТЕ MAX (`ID`) ОТ `city`

В резултат на заявката получихме стойността на колоната на последния ред. Оказва се, че MySQL е преброил броя на редовете.

Ако е необходимо, можете да получите последния запис в неговата цялост:

SELECT MAX(`ID`),`Име`,`Код на държавата`,`Област`,`Население` ОТ `град`

ИЗБЕРЕТЕ МАКС. (`ИД`), `Име`, `Код на държавата`, `Област`, `Население` ОТ `град`

Моля, имайте предвид, че за избор, преди да извикате функцията, вместо „*“ ние изброяваме имената на всички колони. Това е синтактична функция при използване на вградени функции в MySQL.

Определяне на броя на записите в PHP

Често в кода на PHP MySQL сайтове трябва да се получи броят на редовете, за да се предаде тази стойност като входен параметър за по-нататъшна обработка. Това може да стане със следния код:

query("SELECT * FROM `country`")) ( printf("Таблицата има %d реда.\n", $result->num_rows); $result->close(); ) mysqli_close($con); ?>

За да определите броя на записите в MySQL таблица, трябва да използвате специалната функция COUNT().

Функцията COUNT() връща броя на записите в таблица, които отговарят на даден критерий.

Функцията COUNT(expr) винаги брои само тези редове, за които резултатът от expr е NOT NULL.

Изключението от това правило е при използване на функцията COUNT() със звездичка като аргумент - COUNT(*) . В този случай се броят всички редове, независимо дали са NULL или NOT NULL.

Например функцията COUNT(*) връща общия брой записи в таблицата:

SELECT COUNT(*) FROM table_name

Как да преброим броя на записите и да ги покажем на екрана

Примерен PHP+MySQL код за преброяване и показване на общия брой редове:

$res = mysql_query("SELECT COUNT(*) FROM table_name") $row = mysql_fetch_row($res); $общо = $ред; // общо записи echo $total; ?>

Този пример илюстрира най-простата употреба на функцията COUNT(). Но можете да изпълнявате и други задачи, като използвате тази функция.

Чрез указване на конкретна колона на таблица като параметър, функцията COUNT(column_name) връща броя на записите в тази колона, които не съдържат NULL стойност. Записи с NULL стойности се игнорират.

SELECT COUNT(име_на_колона) ОТ име_на_таблица

Функцията mysql_num_rows() не може да се използва, защото за да разберете общия брой записи, трябва да изпълните SELECT * FROM db заявка, тоест да вземете всички записи, а това не е желателно, така че е за предпочитане използвайте функцията за броене.

$result = mysql_query("SELECT COUNT (*) as rec FROM db");

Използване на функцията COUNT() като пример

Ето още един пример за използване на функцията COUNT(). Да приемем, че има таблица ice_cream с каталог за сладолед, който съдържа идентификатори на категории и имена на сладолед.

Веднъж се сблъсках с този проблем, но много от решенията, предлагани в интернет, не работеха за мен. И все пак намерих изход. И дори не сам.

Метод 1. phpMyAdmin

Нека започнем с най-простото и очевидно. Да кажем, че не е необходимо да използвате резултата в кода, а просто да разберете броя на редовете, това е всичко.

След това отидете на phpMyAdmin (localhost/tools/phpmyadmin - за Denver), след това изберете желаната база данни, след това изберете таблицата, броя на редовете, в които искате да разберете, и вижте следното съобщение:

Метод 2. БРОЯ

Ето как изглежда самата SQL заявка:

SQL заявка с условие:

Внедряване в PHP:

По същия начин можете да добавите условие тук. След това кодът ще покаже броя на редовете в таблицата, които отговарят на условието.

Метод 3: mysql_num_rows

Например в WordPress публикациите се съхраняват в таблицата wp_posts, така че можем да разберем колко публикации (публикации) се съхраняват в базата данни (в MySQL таблицата). Този код е даден само за пример (или за случаите, когато средата на WordPress не е заредена), тъй като в WordPress свързването към базата данни се извършва чрез .

Резултатът ще включва абсолютно всички записи. Как мога да разбера броя само на тези, които са публикувани? За да направим това, ще трябва леко да променим SQL заявката.

Започвайки от версия 4.0, СУБД MySQL има доста удобна възможност да преброи броя на всички записи, които отговарят на заявка, когато броят на записите е ограничен от LIMIT. При работа с търсене в база данни, както и при избор от таблици с голям брой записи, такава функционалност е просто необходима.

Синтаксис. В заявка SELECT трябва да посочите опцията SQL_CALC_FOUND_ROWS преди списъка с колони. Ето началото на синтаксиса SELECT.

ИЗБЕРЕТЕ




select_expr, … …

По този начин, когато изпълнявате заявката SELECT SQL_CALC_FOUND_ROWS, СУБД ще преброи общия брой редове, които отговарят на условието на заявката, и ще съхрани този брой в паметта. Естествено, заявката SELECT SQL_CALC_FOUND_ROWS има смисъл само когато се използва ограничение (LIMIT). Веднага след изпълнение на заявката за избор, за да получите броя на записите, трябва да изпълните друга заявка SELECT: SELECT FOUND_ROWS ();. В резултат MySQL ще върне един ред с едно поле, в което ще се съхранява броят на редовете.

Пример за самите заявки:

> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE число > 100 LIMIT 10;
> ИЗБЕРЕТЕ FOUND_ROWS();

Първата заявка ще върне (изведе) 10 реда от таблица tbl_name, за които номерът на условието е верен > 100. Второто извикване на командата SELECT ще върне броя редове, които първата команда SELECT би върнала, ако беше написана без изразът LIMIT. Въпреки че използването на командата SELECT SQL_CALC_FOUND_ROWS изисква MySQL да преизчисли всички редове в набора от резултати, тя все още е по-бърза, отколкото без LIMIT, защото не трябва да изпраща резултата на клиента.

Примерни заявки от PHP:

$result = mysql_query("SELECT SQL_CALC_FOUND_ROWS * FROM table1 LIMIT 0, 10″, $link);
докато ($row = mysql_fetch_assoc($result))
{
var_dump($ред);
}

$result = mysql_query("SELECT FOUND_ROWS()", $link);
$num_rows = mysql_result($result, 0);
echo "$num_rows редове\n";

В резултат на изпълнение на кода, при условие че $link сочи към отворена връзка към СУБД, PHP ще отпечата 10 реда от таблицата table1 и след това цяло число на броя редове, които отговарят на заявката (игнорирайки LIMIT).

В UNION заявки SQL_CALC_FOUND_ROWS може да се държи по два начина поради факта, че LIMIT може да се появи на множество места. Преброяването на редове може да се извърши за отделни SELECT заявки или за цялата заявка след обединяване.

Целта на SQL_CALC_FOUND_ROWS за UNION е, че трябва да върне броя редове, които биха били върнати без глобален LIMIT. Условията за използване на SQL_CALC_FOUND_ROWS с UNION са изброени по-долу:

  • Ключовата дума SQL_CALC_FOUND_ROWS трябва да бъде указана в първия оператор SELECT.
  • Стойността на FOUND_ROWS() ще бъде точна само ако се използва UNION ALL. Ако UNION е указано без ALL, възниква елиминиране на дубликат и стойността на FOUND_ROWS() ще бъде само приблизителна.
  • Ако LIMIT не присъства в UNION, тогава SQL_CALC_FOUND_ROWS се игнорира и се връща броят на редовете във временната таблица, която е създадена за изпълнение на UNION.


Свързани публикации