Определяем количество записей MySQL: пример кода

Чтобы определить количество записей в таблице MySQL, нужно воспользоваться специальной функцией COUNT().
Количество записей MySQL

Функция COUNT()

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

Функция COUNT(expr) всегда считает только те строки, у которых результатом выражения expr является NOT NULL.

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

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

SELECT COUNT(*) FROM table_name

Как посчитать количество записей и вывести на экран

Пример PHP+MySQL-кода для подсчета и вывода общего количества строк:

<?php>
$res = mysql_query("SELECT COUNT(*) FROM table_name")
$row = mysql_fetch_row($res);
$total = $row[0]; // всего записей
echo $total;
?>

Этот пример иллюстрирует самый простой вариант использования функции COUNT(). Но с помощью этой функции можно выплнять и другие задачи.

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

SELECT COUNT(column_name) FROM table_name

Использовать функцию mysql_num_rows() нельзя, потому что для того, чтобы узнать общее количество записей, нужно выполнить запрос SELECT * FROM db, то есть получить все записи, а это нежелательно, поэтому предпочтительнее использовать функцию count.

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

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

Вот еще один пример использования функции COUNT(). Допустим, есть таблица ice_cream с каталогом мороженого, в которой находятся идентификаторы категорий и названия мороженого:

idname
1«Пломбир № 1»
1100% мороженое
1Эскимо № 1
2«Румба»
2«Фрутсок»

Задача: Нужно посчитать, сколько наименований мороженого содержится в каждой категории.

Решение этой задачи очевидно:

Статья по теме:  Яндекс.Школа вебмастеров

SELECT id, COUNT(*) FROM ice_cream GROUP BY id

Результат:

idcount
13
22

Если надо вывести населенный пункт и количество населенных пунктов в городе, то можно воспользоваться таким кодом:

SELECT tab1.subcity,COUNT(tab2.city) FROM tab1 LEFT JOIN tab2 ON tab1.subsity = tab2.subcity

Резюме

Соответственно, для решения более сложных задач в функцию COUNT() можно подставить выражение, возвращающее NULL или NOT NULL. Если строку нужно посчитать — выражение должно возвращать NOT NULL.


Понравилась статья? Поделиться с друзьями:
Комментарии: 125
  1. bkpwr

    спс огромное

    1. FORTRESS-DESIGN (автор)

      Считайте на здоровье :)

  2. antifrize

    Спасибо, пригодилось!!!

    1. FORTRESS-DESIGN (автор)

      Пожалуйста.

  3. Виктор

    А вот еще пример ребята, что бы вы не мучались. Так происходит подсчет сделок по обмену!

    $db = mysql_connect ("localhost","user","parol");
    mysql_select_db ("test", $db);
    $result = mysql_query("SELECT  COUNT(sdelka) FROM jos_test WHERE sdelka='Обмен' ");
    $myrow = mysql_fetch_array($result);
    $total=$myrow[0];
    echo $total;
    
    1. FORTRESS-DESIGN (автор)

      Ну да, здесь тот же запрос, только с условием WHERE. Так можно считать количество записей соответствующих определенному условию.

  4. Jay

    А как средствами MySQL найти максимальное количество строк с одинаковыми значениями? То-есть если брать таблицу (пример с мороженым) — что максимальное количество строк принадлежит ID=1 и равняется 3? Другими словами вытащить из COUNT GROUP BY максимальное значение с указанием на оное?

    Спасибо!

  5. Jay

    Поясню задачу:

    Есть таблица ORDER в которой отражаются заказы. В ORDER есть поле ITEM — наименование товара. Как одним запросом или вложенным запросом подсчитать какой товар заказывали больше всего? То есть узнать какое количество строк с одинаковым наименованием самое большое в таблице.

    Задача казалось бы повседневная и элементарная для других СУБД.
    В MySQL почему-то решения не нахожу. Напрашивается что-то типа COUNT(MAX(COUNT('item') GROUP BY item)), но говорят так нельзя.

    Всем заранее спасибо!

  6. Jay

    Как обычно сам и отвечаю:

    SELECT item, COUNT(item) AS count FROM order GROUP BY item ORDER BY count DESC;

    На выходе получаем количество вхождений каждого ITEM в порядке убывания.

    Всем спасибо.

    1. FORTRESS-DESIGN (автор)

      Сорри, что сразу не мог ответить. Вы сделали все правильно.

      Если нужно получить максимальное значение группы, можно ограничить количество строк, выдаваемых командой SELECT. Для этого можно использовать выражение LIMIT с числовым аргументом:

      SELECT item, COUNT(item) AS count FROM order GROUP BY item ORDER BY count DESC LIMIT 1;

      SELECT item — это поле таблицы. В возвращаемом результате (а результатом будет таблица) поле будет иметь такое же имя.

      COUNT(item) AS count

      COUNT(item) — это результат вычисления. В возвращаемой таблице это поле будет безымянным, если не указать ему понятное имя, что и делается инструкцией AS count.

      a AS b — в SQL значит «считать, что указаный объект/выражение a имеет имя b».

  7. lukesky

    Обычно пользуюсь таким:

    $resul = mysql_query("SELECT COUNT(*) FROM news"); 
    $result = mysql_num_rows($resul); 
    echo $result;
    
    1. FORTRESS-DESIGN (автор)

      Да, lukesky, клево. Спасибо за пример.

      Если надо только посчитать количество записей, то использовать функцию mysql_num_rows наиболее оптимально.

      Но если, кроме определения количества записей, данные необходимо еще обрабатывать, то придется делать новый запрос и тогда использовать данную функцию будет не целесообразно.

      1. JeroniMMo

        3.5.1 Максимальное значение столбца

        «Как определить наибольшее значение в столбце?»

        SELECT MAX(article) AS article FROM shop

        +———+
        | article |
        +———+
        | 4 |
        +———+

        3.5.2 Строка, содержащая максимальное значение некоторого столбца

        «Как определить номер, дилера и цену самого дорогого изделия?»

        В ANSI SQL (и MySQL 4.1) это легко делается при помощи вложенного запроса:

        SELECT article, dealer, price
        FROM shop
        WHERE price=(SELECT MAX(price) FROM shop)

        В версиях MySQL до 4.1 такая задача выполняется в два этапа:

        1. Следует получить максимальное значение цены из таблицы при помощи оператора SELECT.
        2. Используя это значение, необходимо составить следующий запрос:

        SELECT article, dealer, price
        FROM shop
        WHERE price=19.95

        Существует еще одно решение: отсортировать все строки по убыванию цен и после этого получить первую строку, используя специальный оператор LIMIT:

        SELECT article, dealer, price
        FROM shop
        ORDER BY price DESC
        LIMIT 1

        Примечание: если существует несколько самых дорогих изделий (например, каждое из них стоит 19,95), запрос, использующий LIMIT, возвращает лишь одно из них!
        3.5.3 Максимальное значение столбца для группы

        «Как определить наибольшую цену по каждому изделию?»

        SELECT article, MAX(price) AS price
        FROM shop
        GROUP BY article

        +———+——-+
        | article | price |
        +———+——-+
        | 0001 | 3.99 |
        | 0002 | 10.99 |
        | 0003 | 1.69 |
        | 0004 | 19.95 |
        +———+——-+

    2. Аноним

      Не обязательно вводить вторую переменную:
      $result = mysql_query("SELECT COUNT(*) FROM news");
      $result = mysql_num_rows($result);

  8. Виктор

    У меня, ребята такой вопрос. Как организовать передачу переменной методом GET в джумле?

    Я прописываю ссылку
    index.php?option=com_content&view=article&id=13&Itemid=13?a=5,
    пытаюсь передать а=5 в другую статью, но передача не происходит.

    1. FORTRESS-DESIGN (автор)

      Это не связано с Джумлой. Вы допустили ошибку в синтаксисе передачи параметров метода GET.
      index.php?option=com_content&view=article&id=13&Itemid=13?a=5

      Вместо второго вопросительного знака нужно поставить амперсанд:
      index.php?option=com_content&view=article&id=13&Itemid=13&a=5

  9. Виктор

    Спасибо за подсказку!!!

    1. FORTRESS-DESIGN (автор)

      Пожалуйста :)

  10. Сергей

    Имеются строки с записями:

    `id``user_id`
    12
    23
    33
    44
    54
    64

    Почему-то у меня не считает количество строк

    $res = mysql_query("SELECT `user_id`, COUNT(*) FROM `table`  GROUP BY `user_id`;");
      $row = mysql_fetch_row($res);
      $total = $row[0]; // всего записей
      echo $total;
    

    При таком выражении показывается значение `user_id` в первой строке, а надо посчитать именно количество сгруппированных записей
    Почему так ни как не пойму? Можете подсказать, что здесь не правильно?
    Пробовал и mysql_result($res, 0); но результат всегда один — 2. хотя должно получится 3.

    1. FORTRESS-DESIGN (автор)

      Результат подсчета количества записей в каждой группе должен быть таким:

      user_idколичество записей
      21
      32
      43

      Проблема с выводом данных. Дело в строке $row[0]. Ведь результатом будет не одна цифра, как вы ожидаете, а одна строка для каждой группы.

  11. FORTRESS-DESIGN (автор)

    Для определения количества записей в каждой группе — запрос правильный

    $res = mysql_query("SELECT user_id, COUNT(*) FROM table GROUP BY user_id");

  12. FORTRESS-DESIGN (автор)

    COUNT(*) — считает сколько всего записей. В комбинации с GROUP BY идет подсчет записей в каждой группе, а не количество групп.

    1. Сергей

      А как тогда посчитать количество групп?

      1. badevlad

        А Вам что, собственно нужно? Если Вы хотите правильно вывести результаты запроса SELECT `user_id`, COUNT(*) FROM `table` GROUP BY `user_id`, то Вам нужно только поменять вот это:

        $total = $row[0]; // всего записей
        echo $total;
        

        на вот это:

        $user_id = $row[0]; // айдишник
        $total = $row[1]; // всего записей
        echo $user_id.' — '.$total;
        

        Запрос совершенно верен и полностью решает первоначально поставленную задачу. Если же задача поменялась, пожалуйста, уточните ее.

        1. FORTRESS-DESIGN (автор)

          Спасибо, badevlad. Всегда рад твоим компетентным и исчерпывающим ответам.

        2. Сергей

          Наверно я не правильно объяснил первый раз, но у меня изначально стояла задача посчитать кол-во групп , а не кол-во записей в группе. Т.е. из условия должно получится три группы и результат должен быть 3.

          Как пояснил fortresseo, данный запрос не подходит для решения, т. к. он выводит именно кол-во записей к каждой группе, а не кол-во групп.

          И я не знаю как это сделать :(

          1. badevlad

            Вроде так в MySQL можно:
            SELECT COUNT(DISTINCT user_id) FROM table

            Или вот так, чуть сложнее:
            SELECT COUNT(*) FROM (SELECT DISTINCT user_id FROM table) a

            1. Сергей

              О_о. Кланяюсь Вам в ноги до пола :)
              и огромное Вам спасибо. Оба запроса работают как часы. :)

              1. FORTRESS-DESIGN (автор)

                Присоденяюсь с благодарностью за все подсказки Бадевлада в подсчете записей MySQL с уникальными значениями id.

  13. Виктор

    Вы можете подсказать как вычислить разницу между датами в днях? Допустим есть дата начала и дата окончания проекта. Сколько дней занял проект?

    $db = mysql_connect ("localhost","admin","пароль");
    mysql_select_db ("project", $db);
    $result = mysql_query ( "SELECT * FROM jos_catalog WHERE id='1' ",$db);
    $myrow = mysql_fetch_array($result);
    echo $myrow['databegin'];
    echo $myrow['dataend'];
    $a= $myrow['dataend']- $myrow['databegin'];
    echo $a;
    

    Примерно вот так должно быть…

  14. Dezma

    Подскажите пожалуйста! не знаю как решить… ничего не получается…

    У меня на главной выводятся статьи. Пусть будет 3 статьи.
    У каждой статьи есть ссылка на страничку с подробным описанием.
    Пусть будет так: /articles-item.php?id=7&table=blogs_users

    Так же есть страничка comments.php которая добавляет комментарии в отдельную таблицу. Comment .
    В файле articles-item.php выводится подробная информация с комментариями. Комментарии достаем из таблицы по ID. то есть вытаскиваем все комментарии где ID = 7.. Вопрос. Как мне на главной посчитать сколько комментариев у которых ID = номеру таблицы.

    Есть таблица:

    id post
    1 7
    2 7
    3 4
    4 2
    5 7
    6 4

    Должен вывести. На главной возле каждой статьи должен показать сколько Комментов с таким же параметром что и ID Таблицы. если post =7 значит он относиться к таблице 7.

  15. Алексей

    Очень помог код. Я использовал вариант с условием где название поля равнялось конкретному значению. Таким образом подсчитал кол-во записей с этим значением. Мне это было нужно, чтобы на сайте, в спец. предложения, нельзя было добавлять одинаковый товар дважды. Теперь всё ок.

    1. FORTRESS-DESIGN (автор)

      Классно. Я очень рад, что вам это пригодилось.

  16. Иван

    Есть таблица в которой id (номер коммента), post (номер поста в котором размещается текст коммента), author, сам текст, дата и т. д.
    Подскажите, пожалуйста, как подсчитать количество комментариев каждого пользователя?

    1. JeroniMMo

      SELECT COUNT(*) FROM таблица WHERE autor='никнейм'

      1. JeroniMMo

        точнее:
        SELECT COUNT(*) AS postuser FROM таблица WHERE autor=’никнейм’

        и вот postuser и будет количество.

  17. Zheka

    нужно посчитать количество одинаковых значений в каждом из двух столбцов, а потом вывести просто в цифрах

    1. Zheka

      и сравнить эти два столбца

  18. Zheka

    $per=("Новочеркасский электровозостроительный завод");
    $per1=("Луганский тепловозостроительный завод");
    $per2=("Ишимский механический завод");
    $per3=("Кандалакшский опытный машиностроительный");
    $per4=("Коломенский завод");
    $per5=("Пенза Дизельмаш");
    $per6=("Завод им. Малышева");
    $per7=("Волжский дизель");
    $per8=("244");
    $per9=("246");
    $per10=("344");
    $per11=("346");
    $per12=("444");
    $per13=("446");

    $res = mysql_query("SELECT COUNT(*) FROM kniga_povrezhdenii_i_neispravnostey_lokomotivov where zavod='$per' or '$per1' or '$per2' or '$per3' or '$per4' or '$per5'");
    $row = mysql_fetch_array($res);
    $total = $row[0]; // всего записей

    $res2 = mysql_query("SELECT COUNT(*) FROM kniga_povrezhdenii_i_neispravnostey_lokomotivov where Nremontnoi_brigad='$per8' or '$per9' or '$per10'");
    $row2 = mysql_fetch_row($res2);
    $total2 = $row2[0]; // всего записей

    echo $total;
    print("");
    echo $total2;
    print("");

    if ($total>$total2){
    echo ("zavod");

    } else
    echo ("brig");

    во втором запросе что то не так, потому что он выводит общее количество строк, а в первом как надо, повторяющиеся

  19. Павел

    Помогите пожалуйста сделать как у вас на сайте и на других вывод количества комментарий в статье (39 комментариев:)

    1. Павел

      Задача решена, извените за неудобстава.

  20. Последний воин

    Предположим что запрос SELECT id, COUNT(*) FROM ice_cream GROUP BY id используется с условием WHERE , например условием может являться наличие символа «№» в столбце name.
    Тогда результат запроса будет
    id count
    1 2
    А по идее необходимо, чтобы запрос выполнился с результатом
    id count
    1 2
    2 0
    т.е. в результате выполнения запроса нет нулевых значений. Как можно составить запрос, чтобы нулевые значения не отбрасывались

  21. Гость

    Статья взята из про. программирование на PHP, Дениса Колисниченко? ;)

    1. FORTRESS-DESIGN (автор)

      Хе-хе, нет. Она писалась в живую. Потом дополнялась и дорабатывалась. В самом начале она состояла из одного примера. Мой друг, программист, Денис Балыкин спросил: «Почему только один пример?».

  22. Александр

    Спасибо большое этому сайту! здесь нашел много интерестного, наверно самое гланая особеность этого сайта в том что здесь все с примерами и подробным описанием! еще раз спасибо большое автору сайта

    1. FORTRESS-DESIGN (автор)

      Пожалуйста. Если нравится, то нажимайте +1 и Лайк. Я буду за это благодарен.

  23. Дос

    Здравсвтуйте, помогите реализовать следующее:
    есть одинаковые ряды с разным количеством повторов, среди них нужно показать те, количество повторов равно 2.

    По жтому запросу «SELECT number, COUNT(number) AS count FROM tab_data GROUP BY number» получаю:

    number count
    2934234 28
    2934235 5
    2934236 42
    2934238 2
    2934239 3
    2934240 2
    2934247 2
    2934248 2
    2934249 2
    2934250 2
    2934251 9
    2934252 2
    2934253 2
    2934256 3

    А именно с count 2 не могу вытянуть.

    1. JeroniMMo

      Могу предложить только это:


      // Делаем запрос
      $query = mysql_query("SELECT chan_id, COUNT(chan_id) AS count FROM streams GROUP BY chan_id");
      // Выясняем кол-во записей
      $result = mysql_num_rows($query);
      echo "Количество записей: ".$result."; ";
      // Загоняем результат в массив
      for ($i=0; $i $v) {
      // выбираем записи с count = 2
      if ( $v['count'] == 2) {
      // Тут нужное нам действие
      echo $v['chan_id']."";
      }
      }

      1. JeroniMMo

        // Делаем запрос
        $query = mysql_query(«SELECT chan_id, COUNT(chan_id) AS count FROM streams GROUP BY chan_id»);
        // Выясняем кол-во записей
        $result = mysql_num_rows($query);
        echo «Количество записей: «.$result.»; «;
        // Загоняем результат в массив
        for ($i=0; $i $v) {
        // выбираем записи с count = 2
        if ( $v[‘count’] == 2) {
        // Тут нужное нам действие
        echo $v[‘chan_id’].»»;
        }
        }

      2. JeroniMMo


        // Делаем запрос
        //$query = mysql_query("SELECT chan_id, COUNT(chan_id) AS count FROM streams GROUP BY chan_id");
        // Выясняем кол-во записей
        //$result = mysql_num_rows($query);
        //echo "Количество записей: ".$result."; ";
        // Загоняем результат в массив
        //for ($i=0; $i $v) {
        // выбираем записи с count = 2
        //if ( $v['count'] == 2) {
        // Тут нужное нам действие
        //echo $v['chan_id']."";
        //}
        //}

      3. JeroniMMo

        Пол кода при вставке стирается((( Админы, что за?

  24. MrBrown

    Здравствуйте!
    Кажется, всё понятно после вашего урока, ан не получается, прошу помоши.
    Есть три таблицы:
    таблица разделов parts с полями: id | part (плодовые, овощи, ягоды …)
    таблица категорий cats с полями: id | id_part | cat (яблоня, картофель, клубника…)
    таблица статей data с полями: id | id_cat | text | остальные поля.
    Естественно, `cats`.`id_part`=`parts`.`id` и `data`.`id_cat`=`cats`.`id`
    Вот мой запрос, выводящий в меню разделы и категории, причем пустые категории он не выводит, это так и надо:

    <?php
    echo '';
    echo ''.$myrow2['part'].'';
    echo'';
    $n = $myrow2['id'];
    $result3 = mysql_query("SELECT DISTINCT `cats`.id, `cats`.id_part, `cats`.cat FROM `cats` JOIN `data` ON `cats`.id = `data`.id_cat WHERE `cats`.id_part = '{$n}' GROUP BY `cats`.id ");//запрос категорий в соответствующем разделе

    while($myrow3 = mysql_fetch_assoc($result3))
    {
    echo '';
    echo ''.$myrow3['cat'].' ('.$count.')';
    echo '';
    }
    ?>

    Пожалуйста, подскажите, как изменить запрос и получить переменную $count количества статей, соответствующих нужной категории.
    Спасибо.

  25. НЕЗНАКОМКА

    Вот какой вопрос.
    SQL-запросы в visual foxpro. условие вывести количество изданий на карточке каждого читателя. объяснили так

    SELECT CNT(num), name1+’ ‘+LEFT(name2,1)+’.’+LEFT(name3,1)
    FROM fond, abonent
    WHERE fond.num=abonent.num
    GROUP by num,name1

    не работает. запросы мы изучали мельком, потому сама не могу понять.

    LOCAL cSQL, cKod
    SELECT 2
    cKod=ALLTRIM(STR(num))

    cSQL=»SELECT COUNT(fond.num), abonent.name1+’ ‘+LEFT(abonent.name2,1)+’.’+LEFT(abonent.name3,1)+’.’ » + ;
    » FROM base3!fond, base!abonent» + ;
    » WHERE fond.num = abonent.num » + ;
    » GROUP BY num, name1 »

    WITH thisform.Grid2
    .RecordSource=’ ‘
    .RecordSource=cSQL
    ENDWITH

    Спасибо

  26. Николай

    Задача в SQL. Есть таблица с колонками UserID (имя юзера), TimeUsers (указывает время проведенное на сайте), Datetime (день в который юзер был на сайте), UserApp (устройство с которого заходил юзер). За один день юзер мог заходить на сайт несколько раз с разным временем прибывания.
    Нужно вывести по каждому юзеру суммарное время за конкретный день и с кого устройства заходил юзер.
    Спасибо!

    1. JeroniMMo

      Сначала вытаскиваем устройства конкретного юзера за день:

      SELECT `UserApp` FROM `tablename` WHERE `UserID` = 'нужное нам имя юзера' AND `Datetime`= 'нужная нам дата'

      Далее суммируем время посещения:

      SELECT `TimeUsers` FROM `tablename` WHERE `UserID` = 'нужное нам имя юзера' AND `Datetime`= 'нужная нам дата' GROUP BY `TimeUsers`

  27. Roman

    Здравствуйте!
    Помогите решить следующую задачу.
    имеется 2 таблицы:
    id1 descript
    1 descr1
    2 descr2
    3 desct3

    и

    id1 id2
    1 1
    1 2
    2 3
    2 4
    2 5

    Требуется составить запрос в SQL, который бы выводил

    id1 descript count
    1 descr1 2
    2 descr2 3

    count — количество включений id1 во 2-ю таблицу.

  28. Nikita

    Здравствуйте. Завела в тупик следующая задача, помогите разобраться.

    Есть 2 таблицы:
    -posts [id, title, text]
    -comments [comment_id, post_id, text, published]

    Необходимо вывести все записи из таблицы post а так же количество опубликованных (т.е. published = TRUE) комментариев.

    1. JeroniMMo

      SELECT p.*, c.*, COUNT(*) AS `counts` FROM `posts` AS p, `comments` AS c WHERE c.published = 1 AND p.id = c.post_id GROUP BY c.post_id

    2. JeroniMMo

      Не советую пользоваться (published = TRUE) Лучше использовать числовые значения 0 , 1 типов INT или ENUM

  29. Andrey

    всем пивет нужна помощь, есть таблица
    id name_hotel zvezd
    1 название1 5
    2 название 2 4
    3 название 3 5
    нужно сделать чтобы считалось
    5 звезд столько то ( тобишь чтоб вывелось 2)
    4 звезды столько то (а здесь 1)

    1. JeroniMMo

      SELECT `zvezd`, COUNT(*) AS `counts` FROM `tablename` GROUP BY `zvezd`

  30. Владислав

    Спасибо, смог вывести количество комментариев к материалу :)

  31. Тимур

    Таблица такая
    lgid
    18
    18
    7
    18
    7
    7
    12
    12
    как в массив вывести
    18=>3
    7=>3
    12=>2
    Поможете? Заранее спасибо

  32. Serg

    Спасибо. Четко, быстро и по смыслу.
    Понадобился, так этот сниппет прямо скопировал, имя таблицы заменил и вывел себе в форме.

  33. Маким

    Я в ступоре с этим COUNT:
    SELECT *, COUNT(`id`) AS `countid` FROM `material` WHERE `company` = '23' ORDER BY `id` DESC
    COUNT считает хорошо, но склеивает записи
    А мне хочется и все эти записи выбрать и вывести и их общее количество получить.
    Пытался обмануть:
    SELECT *, COUNT(`id`) AS `countid` FROM `material` WHERE `company` = '23' GROUP BY `id` ORDER BY `id` DESC
    тогда напротив каждой записи единичка ))))

  34. JeroniMMo

    А нельзя чтоли просто посчитать кол-во выбранных записей?

    $select = 'SELECT * FROM `material` WHERE `company` = '23' ORDER BY `id` DESC';
    $results = mysql_query($zapros);
    $i=0;
    while ( $result = mysql_fetch_assoc($results) ) {$list[$i] = $rs;$i++;}
    $totalRows = $i;
    

    $totalRows — кол-во записей. $list — массив с записями.

    А можно и просто после выбора записей из базы просто посчитать их php функцией count():
    $totalRows = count($list);
    Это на скорую руку написал, можно и оптимизировать и упростить, но принцип такой)

    1. FORTRESS-DESIGN (автор)

      Спасибо, JeroniMMo.

    2. Маким

      Нет, просто не получится:

      уж лучше использовать mysql_num_rows, чем $i++, она тоже самое и делает, но по многочисленным нареканием на её медленность советуют использовать COUNT, который сразу дает ответ на вопрос о количестве выбранных записей без всяких $i++, жрущие процессорное время совсем неэффективно.

      Неужели если использовать COUNT, то прийдётся писать в два этапа: запрос данных + запрос количества полчаемых данных.

      P.S.: принципы то я понимаю, если, 10 новостей на страницу вывести с пагинацией то и $i++ прокатит очень даже, а с несколькими тысячами записей хочется как-то пооптимальней.

  35. JeroniMMo

    Ну может тогда JOIN LEFT или что то вроде этого?

  36. Narek

    Здравствуйте.
    Есть база «uchot», и таблица «pacient»

    Id first_name last_name date

    1 Степан Иванов 12/03/ 2014
    2 Смирнов 12/03/2014
    3 Вадим Попов 13/03/2014
    4 Денис Новиков 14/03/2014

    Как видно из таблицы в 2 строке не заполнен столбец «data_outcoming»
    Нужно составить запрос к MYSQL
    Вопрос:1. Как подсчитать количество строк у которых заполнен столбец » first_name»?
    Вопрос: 2. Как подсчитать количество строк у которых незаполнен столбец » first_name»?

    Вот структура базы
    CREATE TABLE IF NOT EXISTS `patient` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `first_name` varchar(255) NOT NULL,
    `last_name` varchar(255) NOT NULL,
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

    Такой вариант не подходит!
    $sql=’SELECT COUNT (*) as count FROM `pacient` WHERE `first_name`IS NULL’;
    $res=mysql_query($sql);
    $counts=mysql_fetch_assoc($res);
    $count=$counts[‘count’];
    echo ‘ ‘.$count.’ ‘;

    1. JeroniMMo

      Не заполнен:
      SELECT COUNT (*) as count FROM pacient WHERE first_name = ""
      Заполнен:
      SELECT COUNT (*) as count FROM pacient WHERE first_name != ""

    2. JeroniMMo

      Поле first_name это строка (varchar) — по этому просто смотрим пустая она или нет…

      1. Narek

        Спасибо за ответ.
        А как выводить число заполненных и не заполненных строк,
        и как будет выглядить если строка не (varcher) а (data)?

        1. JeroniMMo

          как будет выглядить если строка не (varcher) а (data)?В смысле поле `date` из вашего примера?

  37. Narek

    Нет. Там «date» автозаполняемое поле, просто если там будет вводится дата?
    Вот мой index.php
    <?
    include("config.php");

    $sql='SELECT COUNT(*) FROM `pacient` WHERE `phone` IS NOT NULL';
    $res=mysql_query($sql);
    $counts=mysql_fetch_assoc($res);
    $count=$counts['count'];
    echo ''.$count.'';

    $content = '

    Список пациентов

    Список пациентов

    #
    Телефон
    ФИО
     
     

    ‘;

    $res = mysql_query(«SELECT * FROM `patient` ORDER BY `id`»);
    while($patient = mysql_fetch_assoc($res)) {
    $content .= ‘

    ‘.$patient[«id»].’
    ‘.$patient[«phone»].’
    ‘.$patient[«last_name»].’ ‘.$patient[«name»].’ ‘.$patient[«second_name»].’
    РедактироватьУдалить
    История посещений

    ‘;
    }

    $content .= ‘

    Добавить нового пациента

    ‘;
    echo $content;
    ?>

    И таблица
    CREATE TABLE IF NOT EXISTS `patient` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(255) NOT NULL,
    `second_name` VARCHAR(255) NOT NULL,
    `last_name` VARCHAR(255) NOT NULL,
    `phone` VARCHAR(255) ,
    `address` text NOT NULL,
    `comment` text NOT NULL,
    `date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

    Нужно выводить число не заполненых полей «phone» и заполненных полей «phone»
    . По этому запросу ничего не выводить

    1. JeroniMMo

      Ну точно также:
      // Не заполнен:
      SELECT COUNT (*) as count FROM pacient WHERE phone = ""
      // Заполнен:
      SELECT COUNT (*) as count FROM pacient WHERE phone != ""
      А дату так и подставляй:
      SELECT * FROM pacient WHERE date == "2014-03-29 12:30:10"
      гггг-мм-дд чч-мм-сс

  38. Viniculo

    Здравствуйте, такой вопрос, имеются три таблицы:
    1) people (id, name, age, height) — название таблицы (столбцы в ней) — люди
    2) cities (id, name) — города
    3) visits (id, person_id, city_id, date) — посещения
    person_id — внешний ключ к таблице people
    city_id — внешний ключ к таблице cities

    Вопрос заключается в следующем: нужно вычислить человека совершившего наибольшее кол-во поездок.
    Нужно объединить таблицы и вычислить одним запросом, подскажите как?
    Из выше приведенных комментариев использовал:
    SELECT name, COUNT(person_id) AS count FROM `people`, `visits` GROUP BY person_id ORDER BY count DESC LIMIT 1;
    Вроде бы эта команды работает, но она выдает странные результаты (в моем случае):
    (name) Катя, (count) 1188
    Это наврятли может быть верным, так как в visits всего 500 записей

    1. Аноним

      По идее должно быть так:
      SELECT p.name, COUNT(v.person_id) AS count FROM people AS p, visits AS v WHERE v.person_id = p.id ORDER BY count DESC

  39. Narek

    Здравствуйте, есть 2 таблицы users и uchet. Они связанны между собой по (users) id и (uchet) users_id. Как будет выглядеть запрос для вывода количества данных из таблицы uchet в котором поле «bolezn» равно «Грип» и соотвественно вывод всег юзеров из таблизы users у которых есть больезнь «грип»?

    1. JeroniMMo

      Очень просто:
      SELECT u.id AS userid, u.*, uc.id AS uchetid, uc.* FROM users AS u, uchet AS uc WHERE uc.bolezn = 'Грип' AND u.id = uc.users_id
      Суть еще в том, чтоб небыло одинаковых названий полей.

  40. JeroniMMo

    По идее должно быть так:
    SELECT p.name, COUNT(v.person_id) AS count FROM people AS p, visits AS v WHERE v.person_id = p.id ORDER BY count DESC LIMIT 0, 1

  41. Narek

    Здравствуйте, Есть у меня база в каторой строка «date» формат DATE добавлаю туда дату с помощю
    <input type="hidden" size="20" name="date" value="» />,

    и вывожу из базы
    $res = mysql_query(«SELECT * FROM `patient` WHERE `id`=».$_REQUEST[«id»].» «);
    if($row = mysql_fetch_assoc($res)) {
    $content .= ‘
    ‘.$row[«date»].’
    ‘;
    }
    echo $content;
    ?>

    Дело втом что выводится дата типа 2014-09-01, как можно на этом примере конвертировать дату на 01-09-2014, буду благодарен за помощ.

  42. Narek

    Имеются 2 таблицы
    CREATE TABLE IF NOT EXISTS `cw_users` (
    `userid` int(25) NOT NULL AUTO_INCREMENT,
    `first_name` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `last_name` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `email_address` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `username` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `password` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `info` varchar(50) CHARACTER SET utf8 NOT NULL,
    `last_loggedin` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT 'never',
    `user_level` enum('1','2','3','4','5') CHARACTER SET utf8 NOT NULL DEFAULT '1',
    `forgot` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
    `status` enum('live','suspended','pending') CHARACTER SET utf8 NOT NULL DEFAULT 'live',
    PRIMARY KEY (`userid`)
    )

    CREATE TABLE IF NOT EXISTS `reception` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `patient_userid` int(11) NOT NULL,
    `doctor_name` text NOT NULL,
    `fill_date` date NOT NULL,
    `send_place` text NOT NULL,
    `cart` text NOT NULL,
    `date_re_out_select` text NOT NULL,
    `date_in` text NOT NULL,
    `recomended` text NOT NULL,
    `director_type` text NOT NULL,
    `director_name` text NOT NULL,
    `date` text NOT NULL,
    PRIMARY KEY (`id`)
    )

    таблица `reception` связана с таблицей `cw_users` соотвественно по `patient_userid` и `userid`.
    Юзер, зарегистрировавшийся в таблице cw_users может добавлять материалы в таблицу `reception`,
    Задача создать запрос, чтобы вывелся список юзеров зарегистрированных в таблице `cw_users` и перед ними было бы КОЛИЧЕСТВО (число) материалов, которые они добавили в таблицу `reсeption`. Ни как не могу сформировать запрос, помогите пожалуйста конкретным примером.

    1. FORTRESS-DESIGN (автор)

      SELECT userid, first_name, last_name, COUNT(id)
      FROM cw_users
      JOIN reception ON patient_userid = userid
      GROUP BY id

      Как-то так. Без проверки и гарантии работоспособности. Плюс я не знаю, так ли все это в MySQL.

      1. JeroniMMo

        Почти. Одна поправка:

        SELECT userid, first_name, last_name, COUNT(id) as count
        FROM test_cw_users
        JOIN test_reception ON patient_userid = userid
        GROUP BY patient_userid

        Заместо GROUP BY id нужно GROUP BY patient_userid

        1. FORTRESS-DESIGN (автор)

          Спасибо, JeroniMMo.

        2. Narek

          а как вывести имена юзеров и число материалов для каждого юзера. я представил структуру таблицы?

          1. JeroniMMo

            Ну так то, что выше — это и есть вывод имени и кол-во записей.
            userid — id пользователя
            first_name — Имя
            last_name — Фамилия
            count — Кол-во материалов

            Или я не понял вопрос…

            1. Narek

              Вот после этого кода как должен выглядеть код вывода?

              SELECT userid, first_name, last_name, COUNT(id) as count
              FROM cw_users
              JOIN reception ON patient_userid = userid
              GROUP BY patient_userid

              1. JeroniMMo

                Ну дальше основами php. Через циклы. for, foreach.
                Объяснять не буду. Ищи на php.su

                1. Narek

                  Может сделаете исключение?

                2. Narek

                  Скрипт ничего не выводит!!!

                3. Narek

                  вот скрипт (с количеством пока не разобрался), ничего не выводит
                  <?
                  $content = '

                  Список

                  Список

                  #
                  ФИО

                  ';
                  $db = mysql_connect ("localhost","root","");
                  mysql_select_db ("new", $db);
                  $res = mysql_query("SELECT `userid`, `first_name`, `last_name`, COUNT(id) as count
                  FROM `cw_users`
                  JOIN `reception` ON `patient_userid` = `userid`
                  GROUP BY `patient_userid`");
                  while($patient = mysql_fetch_assoc($res)) {
                  $content .= '

                  '.$patient["id"].'
                  '.$patient["last_name"].' '.$patient["first_name"].'

                  ';
                  }
                  $content .= '

                  ';
                  echo $content;
                  ?>

                  1. JeroniMMo


                    $select = "SELECT userid, first_name, last_name, COUNT(id) as count
                    FROM test_cw_users
                    LEFT JOIN test_reception ON patient_userid = userid
                    GROUP BY patient_userid ORDER BY userid ASC";
                    $content = '-ID- ФИО (КОЛ-ВО)';
                    $db = mysql_connect ("localhost","root","");
                    mysql_select_db ("new", $db);
                    $res = mysql_query($select);
                    while($patient = mysql_fetch_assoc($res)) {
                    $content .= '-'.$patient["userid"].'- '.$patient["last_name"].' '.$patient["first_name"].' ('.$patient["count"].')';
                    }
                    $content .= '';
                    echo $content;

                    У меня вот так работает…

      2. JeroniMMo

        Разобрался. Дело все в том, что у Вас дублируются поля, т.е. в таблице cw_users есть поля first_name, last_name и в reception они тоже есть. Из-за этого возникает конфликт в запросе, если напрямую не указать принадлежность полей.
        Вот новый запрос, который точно работает:
        SELECT test_cw_users.userid, test_cw_users.first_name, test_cw_users.last_name, COUNT(test_reception.id) as count FROM test_cw_users LEFT JOIN test_reception ON test_reception.patient_userid = test_cw_users.userid GROUP BY test_reception.patient_userid ORDER BY test_cw_users.userid ASC

        Несколько советов:
        1. пользуйтесь OR DIE() в $db = mysql_connect("localhost","root","") or die("Не удается подключиться к MYSQL-серверу!");
        mysql_select_db("vh34979_flowtv", $db) or die("Не удается выбрать базу данных!");

        2. указывайте кодировку базы: mysql_set_charset('utf8', $db);
        3. пользуйтесь echo mysql_error(); может помочь при непонятках/ошибках в запросе.

        1. JeroniMMo

          Из запроса удалить test_

        2. JeroniMMo

          Запрос можно сократить используя AS:
          SELECT u.userid, u.first_name, u.last_name, COUNT(r.id) as count FROM cw_users AS u LEFT JOIN reception AS r ON r.patient_userid = u.userid GROUP BY r.patient_userid ORDER BY u.userid ASC

    2. JeroniMMo

      Дублирую сюда:

      $select = "SELECT userid, first_name, last_name, COUNT(id) as count
      FROM test_cw_users
      LEFT JOIN test_reception ON patient_userid = userid
      GROUP BY patient_userid ORDER BY userid ASC";
      $content = '-ID- ФИО (КОЛ-ВО)';
      $db = mysql_connect ("localhost","root","");
      mysql_select_db ("new", $db);
      $res = mysql_query($select);
      while($patient = mysql_fetch_assoc($res)) {
      $content .= '-'.$patient["userid"].'- '.$patient["last_name"].' '.$patient["first_name"].' ('.$patient["count"].')';
      }
      $content .= '';
      echo $content;

      1. Narek

        Интересно, почему у меня ничего не выдает????

        1. JeroniMMo

          А у вас таблицы то заполнены? По возможности скиньте дамп базы мне на почту info@csitess.ru

          1. JeroniMMo

            Выше ответил…

            1. Narek

              Как вывести обшее количество записей

              1. JeroniMMo

                SELECT COUNT(*) as all_users_count
                FROM cw_users
                — общее кол-во юзеров
                SELECT COUNT(*) as all_reception_count
                FROM reception
                — общее кол-во материалов

                Ну вы эт, не наглейте.))) Читайте документации. За следующую помощь буду просить $…

      2. Narek

        как можно добавит еше и условие WHERE cw_users.info = ‘».$_SESSION[‘info’].»‘ ?

        1. Narek

          все , разабрался!!!

      3. Narek

        Хочу подсчитать общее количество ‘.$patient[«count»].’ , не пойму как.

  43. Narek

    Спасибо за помощь, как проверю сражу скажу.

  44. men

    у меня в базе имеется 48 объявлений. на первой странице отображается 25 объявлений и на второй должен быть оставшиеся. все прекрасно работает, но когда добавил условие WHERE dosort=".$do." в COUNT первая страница показывает 25 объявлений, на втором выдает ошибку mysql_fetch_array() expects parameter 1 to be resource, boolean given in во второй строке.
    //////////
    1. $chet=mysql_query("SELECT COUNT(*) FROM data WHERE dosort=".$do."",$mysql);
    2. $temp=mysql_fetch_array($chet);
    3. $posts=$temp[0];

    1. JeroniMMo

      Меня интересует WHERE dosort = ".$do.":
      dosort — что за поле (int,text,varchar и т.д.)?
      $do — что передается в переменную?

      1. men

        dosort имеет тип int. в переменную do передается число 1.

        1. JeroniMMo

          Вообще пагинация лимитом делается:
          $page_number = 2 — передаете в переменную номер запрашиваемой страницы
          $per_page = 25 — кол-во материалов выводимых на одну страницу
          $start = ($per_page*($page_number-1))+1 — начало лимита
          "SELECT * FROM data WHERE dosort=".$do." LIMIT ".$start.", ".$per_page
          Сортируйте ORDER BY

          Подробнее читай тут: ruseller

  45. Сергей

    Помогите с выпадающим списком
    Есть база mysql «users»
    PHP:

    CREATE TABLE IF NOT EXISTS `users` (
    `userid` int(25) NOT NULL AUTO_INCREMENT,
    `first_name` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `last_name` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `username` varchar(25) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `password` varchar(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
    `info` varchar(50) CHARACTER SET utf8 NOT NULL,
    PRIMARY KEY (`userid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC COMMENT='Membership Information' AUTO_INCREMENT=1 ;
    В строке "info" вводится или "Школа" или "Институт" или "Садик"

    Мне нужно сделать группировку данных строки «info» и вывести в выпадающий список. Это я делаю вот таким способом
    PHP:

    <?

    $sql = 'SELECT * FROM `users` group by `info`';
    $result = mysql_query($sql);
    // вывод на страницу
    echo '';
    print_r($rez_array);
    // проходим весь массив и вывод данных массива с подстановкой.
    while ($myrow = mysql_fetch_array($result,MYSQL_ASSOC)) {
    echo ' ' . $myrow['info'] . ' ';
    }
    echo '';
    // Освобождаем память
    mysql_free_result($result);
    // закрываем соединение
    mysql_close($db);
    ?>

    Теперь мне нужно, чтобы при выборе в выпадающем списке например «Школа», рядом с этим списком открылся другой выпадающий список, где были бы видны все «user»-ы у которых в поле «info» было бы введено слово «Школа», помогите с кодом.

  46. Андрей

    Здравствуйте . Есть база данных клиентов и заказов на MS SQL Server . Нужно подсчитать сколько заказов приходится на каждого клиента . Делаю запрос
    select
    Table.p_fam ,—фамилия клиента
    count (table.id_order) —номер заказа
    from Table
    group by Table.p_fam
    на выходе получаю

    Попов 1
    Попов 1
    Попов 1
    Попов 1

    а должно быть

    Попов 4
    Как это можно реализовать?
    Спасибо.

    1. JeroniMMo

      Так номера заказов то разные, или я чего-то не понимаю.

      SELECT COUNT(*) AS total, p_fam FROM Table GROUP BY p_fam 
      
  47. Татьяна

    помогите,пожалуйста.
    Имеется БД(drivecar). В базе 2 таблицы car и drive.
    Нужно построить таблицу количества машин по дате выпуска (столбцы – года);
    while ($line = mysql_fetch_array($drive, MYSQL_ASSOC)) {
    echo «»;
    $result_count = mysql_query(«SELECT, count(*) as total from drivecar WHERE id=».$line[‘id’]);
    $count = mysql_fetch_assoc($result_count);
    array_shift($line);
    foreach ($line as $col_value) {
    echo «$col_value»;
    }
    echo «».$count[‘total’].»»;
    echo «»;
    }

    Выводит просто список годов, 2005, 2002, 2005, 2005. А нужно, чтобы так:
    2005 3
    2002 1

    Что не так?(((

    1. Аноним

      Чет я не понял:
      Имеется БД(

      drivecar

      ). В базе 2 таблицы

      car

      и

      drive

      .

      А потом вы почему-то в запросе пишите:

      "SELECT, count(*) as total from drivecar WHERE id=".$line[‘id’]
      

      1. Запятой быть не должно.
      2. Что за drivecar? В запросе надо обращаться к таблице(drive или car), а не к базе.

    2. JeroniMMo

      Чет я не понял:
      Имеется БД(

      drivecar

      ). В базе 2 таблицы

      car

      и

      drive

      .

      А потом вы почему-то в запросе пишите:

      "SELECT, count(*) as total from drivecar WHERE id=".$line[‘id’]
      

      1. Запятой быть не должно.
      2. Что за drivecar? В запросе надо обращаться к таблице(drive или car), а не к базе.

  48. JeroniMMo

    Админ! Верни старую комментировалку. Было удобнее.

    1. FORTRESS-DESIGN (автор)

      Это другой шаблон. Может прикрутить Дискус, Cackle? Или другую посоветуете…

    2. JeroniMMo

      Честно — можно оставить и эту, но прикрутить выделение текста (обычно желтым) в строке (без переноса) и вернуть тег (чтоб тоже можно было отделять текст/код без переноса строк.

    3. JeroniMMo

      Ну вот вырезает текст. плохо это.
      тег code.

    4. JeroniMMo

      Только сейчас глянул код страницы и понял, что теги-то остались. тег code так точно… Это очень хорошо. Вот еще бы и выделение (для заострения внимания читающего), и можно все остальное оставить как есть)))

  49. Олег

    Спасибо пригодилось! Чтобы статья сразу выводилось из «списка» определенной категории, если статья в «списке» только одна.

  50. Владимир

    Господа! мне нужен SQL-запрос
    SELECT kolvo=count(*) FROM имя_таблицы

    чтобы количество строк попало в переменную kolvo!!!
    Это можно сделать в MySQL или нет ???

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: