Узнать количество записей в таблице MySQL
Нужно с помощью PHP узнать сколько в таблице users пользователей, у которых значение rating больше 10. Подскажите пожалуйста, как это сделать?
Отслеживать
20.4k 3 3 золотых знака 27 27 серебряных знаков 49 49 бронзовых знаков
задан 4 апр 2020 в 5:41
Максим Закревский Максим Закревский
347 1 1 золотой знак 5 5 серебряных знаков 14 14 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Если нужно узнать только количество строк, но не нужны сами строки
Для того чтобы узнать количество записей в таблице, нужно использовать SQL функцию COUNT() :
SELECT count(*) FROM users
Если нужно подсчитать количество записей по условию, то его надо добавить в запрос:
SELECT count(*) FROM users WHERE rating > 10
Для получения этого значения в РНР можно выполнить запрос обычным порядком
$res = $conn->query("SELECT count(*) FROM users WHERE rating > 10"); $row = $res->fetch_row(); $count = $row[0];
Если условие задается динамически, то при запросе необходимо использовать подготовленные выражения:
$rating = 10; $stmt = $conn->prepare("SELECT count(*) FROM users WHERE rating > ?"); $stmt->bind_param("s", $rating); $stmt->execute(); $res = $stmt->get_result(); $row = $res->fetch_row(); $count = $row[0];
Если нужно получить сами строки, а также узнать, сколько их
Здесь ещё проще. Просто получаем все строки в массив:
$res = $conn->query("SELECT * FROM users WHERE rating > 10"); $rows = $res->fetch_all(MYSQLI_ASSOC);
Здесь мы получили обычный массив, с которым можем делать то же самое что и с любым другим массивом. например, если нам надо узнать есть ли в массиве что-нибудь, мы можем подставить его в прямо в условие:
if (!$rows) < echo "ничего не нашлось"; >else < foreach ($rows as $row ) < echo $row['name']; >>
Если вдруг надо получить именно количество строк, то просто выполняем обычную функцию count()
Как узнать сколько записей в таблице sql
← →
Novicer ( 2014-02-11 13:04 ) [0]
Пробовал select count(*) frome mytable результата нет 🙁 Мне нужно в ShowMessage показать сколько строк в таблице, а куда сохраняет результат запрос непонятно. Погуглив нашел всюду один пример в виде запроса, в чем сидит результ тайна 🙂
← →
macrodens © ( 2014-02-11 13:05 ) [1]
Запрос через что делаешь?
← →
Германн © ( 2014-02-11 13:09 ) [2]
> куда сохраняет результат запрос непонятно
Сюда http://docwiki.embarcadero.com/Libraries/XE2/en/Data.DB.TDataSet.Fields
← →
macrodens © ( 2014-02-11 13:09 ) [3]
самый простой пример:
Query.SQL.Text := «select count(*) as Cnt from mytable»;
Query.Open;
showmessage(Query.FieldByName(«Cnt»).asstring);
← →
Novicer ( 2014-02-11 13:11 ) [4]
Запрос через IbQuery(ibx) 🙂 Спасибо за пример!
← →
Ega23 © ( 2014-02-11 13:16 ) [5]
var
ds: TIBSQL;
begin
ds := TIBSQL.Create(nil);
try
ds.Connection := . ;
ds.Transaction := . ;
ds.SQL.Text := «select count(*) from mytable»;
ds.Open;
ShowMessage(ds.Fields[0].AsString);
finally
ds.Free;
end;
end;
← →
Novicer ( 2014-02-11 13:20 ) [6]
ShowMessage(IntToStr(IbQuery1.DataSource.DataSet.RecordCount)) приводит к ошибке, а какие были на него надежды. 🙁 Хотел посчитать строки возвращаемые любым запросом.
← →
Ega23 © ( 2014-02-11 13:23 ) [7]
IbQuery1.DataSource.DataSet.RecordCount
Ты в этом уверен? Может быть просто
IbQuery1.RecordCount ?
← →
Novicer ( 2014-02-11 13:24 ) [8]
Не может такого быть чтобы где-то не хранилось количество строк возвращаемых запросом! Только вот я не знаю где. 🙁
← →
Inovet © ( 2014-02-11 13:24 ) [9]
> [5] Ega23 © (11.02.14 13:16)
> ds.Fields[0]
Вот это для определения количества записей даже по какому-то критерию — предпочтительней, имхо, и достаточно безопасно, потому что заранее известно, что по логике в результате кроме 1 единственного поля и 1 единственной записи ничего нет. А вообще при обращении по номеру поля можно накосячить, при последуюющем изменении запроса.
← →
Inovet © ( 2014-02-11 13:25 ) [10]
> [8] Novicer (11.02.14 13:24)
> количество строк возвращаемых запросом
Оно заранее неизвестно вообще-то. Читай справку про RecordCount.
← →
Novicer ( 2014-02-11 13:26 ) [11]
Просто квери.рекордкаунт возвращает бредовую 14, в то время когда в гриде 5 тыщ записей 🙁
← →
Inovet © ( 2014-02-11 13:28 ) [12]
> [11] Novicer (11.02.14 13:26)
> в гриде 5 тыщ
В гриде нет записей
← →
Smile ( 2014-02-11 13:30 ) [13]
RecordCount
🙂
← →
Novicer ( 2014-02-11 13:34 ) [14]
Отображаются записи в гриде, а то что они в датасете все знают, но удобнее говорить в гриде, потому как видишь их там 🙂 прения по этому поводу для ворчунов 😉 попытка узнать рекордкаунт датасета тоже почему-то провалилась с месагой про ошибку 🙁
← →
macrodens © ( 2014-02-11 13:37 ) [15]
по поводу RecorCount внимательнее почитай Ega23 © (11.02.14 13:23) [7]
← →
Smile ( 2014-02-11 13:37 ) [16]
Читай до . (полного понимания)
> Ega23 © (11.02.14 13:23) [7]
🙂
← →
Ega23 © ( 2014-02-11 13:37 ) [17]
> Не может такого быть чтобы где-то не хранилось количество
> строк возвращаемых запросом! Только вот я не знаю где.
> 🙁
Это RecordCount
← →
Ega23 © ( 2014-02-11 13:40 ) [18]
> Оно заранее неизвестно вообще-то. Читай справку про RecordCount.
Я уже подзабыл. Но по-моему, это RecNo не определено. Точнее — зависит от конкретной реализации TDataSet. А вот RecordCount должно быть определённым.
Хотя тут от курсора тоже может зависеть. Но, ИМХО, не для случая с IBQuery
← →
Ega23 © ( 2014-02-11 13:42 ) [19]
> А вообще при обращении по номеру поля можно накосячить,
> при последуюющем изменении запроса.
С одной стороны — да. С другой на FieldByName при массовых операциях оверхед есть.
Но в 99.999% — таки да, FieldByName, кроме случаев получения строго одной записи.
← →
RWolf © ( 2014-02-11 13:44 ) [20]
> Ega23 © (11.02.14 13:37) [17]
> > Не может такого быть чтобы где-то не хранилось количество
> > строк возвращаемых запросом! Только вот я не знаю где.
> > 🙁
> Это RecordCount
только не возвращаемых, а возвращённых на текущий момент.
← →
clickmaker © ( 2014-02-11 13:45 ) [21]
> на FieldByName при массовых операциях оверхед есть
Field := FieldByName(«Name»);
for .
Val := Field.AsString;
end;
← →
Novicer ( 2014-02-11 13:46 ) [22]
РекордКаунт неверно считает для квери, а для датасета вобще приводит к ошибке выполнения. 🙁
← →
Inovet © ( 2014-02-11 13:51 ) [23]
> [19] Ega23 © (11.02.14 13:42)
> С другой на FieldByName при массовых операциях оверхед есть
Ну оверхед при массовой обработке придётся обойти разовым сопоставлением FieldByName и индексов в переменных. А так лучше бы создать поля в дизайнтайм — по крайней мере при изменении запроса будет более осмысленная ошибка.
← →
Inovet © ( 2014-02-11 13:53 ) [24]
> [22] Novicer (11.02.14 13:46)
> РекордКаунт неверно считает для квери
Ты ни ответы ни справку не читаешь?
← →
Ega23 © ( 2014-02-11 13:55 ) [25]
> РекордКаунт неверно считает для квери, а для датасета вобще
> приводит к ошибке выполнения. 🙁
У меня всё работает. Наверное, я — идиот.
← →
Ega23 © ( 2014-02-11 13:56 ) [26]
> clickmaker © (11.02.14 13:45) [21]
Да понятно оно всё. Обойти всегда можно.
← →
Inovet © ( 2014-02-11 13:58 ) [27]
> [26] Ega23 © (11.02.14 13:56)
> Да понятно оно всё. Обойти всегда можно.
Ну так это автору советы.
← →
Novicer ( 2014-02-11 14:05 ) [28]
Ну и фиг с ним с рекордкаунтом этим, будет селект каунт. 🙂 тоже неплохо считает.
← →
Anatoly Podgoretsky © ( 2014-02-11 14:06 ) [29]
Ega23 © (11.02.14 13:55) [25]
> Наверное, я — идиот
Наверно
← →
macrodens © ( 2014-02-11 14:10 ) [30]
ага особенно неплохо select count(*) считает в таблицах с большим количеством записей и полей. (я не к тому, что он не сосчитает, а ко времени на этот запрос)
← →
Ega23 © ( 2014-02-11 14:12 ) [31]
> ага особенно неплохо select count(*) считает в таблицах
> с большим количеством записей и полей. (я не к тому, что
> он не сосчитает, а ко времени на этот запрос)
Это только в вашем б-гомерзском firebird, да и то на первом обращении.
← →
Inovet © ( 2014-02-11 14:21 ) [32]
> [28] Novicer (11.02.14 14:05)
> селект каунт. 🙂 тоже неплохо считает.
Что значит «тоже неполхо». Он по-другому считает, не так как рекордсет. Почувствуй разницу сделав
О, точно. Last надо вызвать.
← →
Германн © ( 2014-02-11 14:49 ) [34]
> Novicer (11.02.14 13:46) [22]
>
> РекордКаунт неверно считает для квери, а для датасета вобще
> приводит к ошибке выполнения. 🙁
Да и вообще, что Делфи, что Си, что SQL жутко глючные заразы. Сплошные ошибки от них. Ничего правильно посчитать не могут.
← →
asail © ( 2014-02-11 16:27 ) [35]
> Ega23 © (11.02.14 14:29) [33]
>
> > IbQuery1.Last;
> > IbQuery1.RecordCount;
>
>
> О, точно. Last надо вызвать.
Не. Согласно феньшую, лучше FetchAll вызывать.
← →
Inovet © ( 2014-02-11 16:36 ) [36]
> [35] asail © (11.02.14 16:27)
> Согласно феньшую, лучше FetchAll вызывать
То по феншую, а автору для понимания как раз Last поможет.
← →
Ega23 © ( 2014-02-11 16:43 ) [37]
> Не. Согласно феньшую, лучше FetchAll вызывать.
Я уже тыщщу лет (шесть) этим не пользовался, сейчас только ORM, а там пофигу.
← →
asail © ( 2014-02-11 16:57 ) [38]
> То по феншую, а автору для понимания как раз Last поможет.
Автору для понимания, кроме справки и подходящей литературы, ничто и никто не поможет. По себе знаю.
← →
Novicer ( 2014-02-12 09:49 ) [39]
>asail Литературу прикупил, бум читать. А вот от справки пока толку мало 🙁 Гугл рулит! 😉 и на форумах еще отзывчивые люди не перевелись, за что им Огромное спасибо. 🙂
← →
clickmaker © ( 2014-02-12 10:04 ) [40]
> Не. Согласно феньшую, лучше FetchAll вызывать.
ну да. Вот сишники до сих пор, чтобы длину строки узнать, вынуждены бежать до закрывающего нуля
MS SQL Server. Как узнать количество записей в таблицах по всей БД.
Для оптимизации производительности БД часто приходиться изучать какие таблицы в БД наиболее «нагружены» (содержат в себе большое количество записей).
Чтобы определить количество записей в каждой таблице по всей БД поможет SQL запрос:
declare @sql varchar(max), @tblname sysname, @tblsch sysname declare @t table ( tablename sysname, [count] bigint) DECLARE vendor_cursor CURSOR FOR select TABLE_SCHEMA,TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' OPEN vendor_cursor FETCH NEXT FROM vendor_cursor INTO @tblsch, @tblname WHILE @@FETCH_STATUS = 0 BEGIN set @sql = 'select '''+@tblname +''' as tablename , count(*) as cnt from '+@tblsch+'.'+@tblname print @sql insert @t(tablename ,[count]) exec (@sql) FETCH NEXT FROM vendor_cursor INTO @tblsch, @tblname END CLOSE vendor_cursor DEALLOCATE vendor_cursor select * from @t order by 2 desc
Результатом выполнения SQL запроса (скрипта) будет список таблиц с указанием количества строк в таблице, отсортированный по убыванию:
Как узнать сколько записей в таблице sql
Базы данных часто используются для получения ответа на вопросы типа: «как часто данные определенного типа встречаются в таблице?» Вам, например, может понадобиться узнать общее количество животных, или то, сколько животных имеется у каждого из владельцев, или провести статистические исследования на базе хранящейся информации.
Процедура подсчета количества животных в сущности идентична подсчету количества строк в таблице, так как на каждое животное приходится по одной записи. Функция COUNT() подсчитает количество непустых результатов, и с ее помощью можно составить следующий запрос для определения числа животных:
mysql> SELECT COUNT(*) FROM pet; +----------+ | COUNT(*) | +----------+ | 9 | +----------+
Ранее мы уже извлекали из таблицы имена владельцев животных. При помощи функции COUNT() можно узнать, сколько животных принадлежит каждому из владельцев:
mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner; +--------+----------+ | owner | COUNT(*) | +--------+----------+ | Benny | 2 | | Diane | 2 | | Gwen | 3 | | Harold | 2 | +--------+----------+
Обратите внимание на использование команды GROUP BY для объединения всех записей по каждому из владельцев. Без этой команды запрос выдал бы только сообщение об ошибке:
mysql> SELECT owner, COUNT(owner) FROM pet; ERROR 1140 at line 1: Mixing of GROUP columns (MIN(),MAX(),COUNT(). ) with no GROUP columns is illegal if there is no GROUP BY clause
Команды COUNT() и GROUP BY очень помогают характеризовать данные различными способами. В примерах, приведенных ниже, вы увидите и другие способы проведения статистических подсчетов.
Количество животных каждого вида:
mysql> SELECT species, COUNT(*) FROM pet GROUP BY species; +---------+----------+ | species | COUNT(*) | +---------+----------+ | bird | 2 | | cat | 2 | | dog | 3 | | hamster | 1 | | snake | 1 | +---------+----------+
Количество животных каждого пола:
mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex; +------+----------+ | sex | COUNT(*) | +------+----------+ | NULL | 1 | | f | 4 | | m | 4 | +------+----------+
(в этой таблице результатов NULL обозначает, что пол животного неизвестен)
Количество животных каждого вида с учетом пола:
mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | NULL | 1 | | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
При использовании функции COUNT() вовсе не обязательно загружать всю таблицу. Например, предыдущий запрос, в котором учитываются только кошки и собаки, выглядит следующим образом:
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE species = "dog" OR species = "cat" -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | +---------+------+----------+
Можно узнать и количество животных каждого пола с учетом только тех экземпляров, пол которых известен:
mysql> SELECT species, sex, COUNT(*) FROM pet -> WHERE sex IS NOT NULL -> GROUP BY species, sex; +---------+------+----------+ | species | sex | COUNT(*) | +---------+------+----------+ | bird | f | 1 | | cat | f | 1 | | cat | m | 1 | | dog | f | 1 | | dog | m | 2 | | hamster | f | 1 | | snake | m | 1 | +---------+------+----------+
