Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 20

Как правильно определить число строк в таблице, удовлетворяющих условию

05.02.2013, 20:25. Показов 2324. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Из двух способов хочется выбрать оптимальный по затратам времени и памяти:
1.
PHP
1
2
    $res = mysql_query("SELECT * FROM `picture` WHERE `author` = " . $id);
    $cnt = mysql_num_rows($res);
2.
PHP
1
2
3
    $res = mysql_query("SELECT COUNT(*) FROM `picture` WHERE `author` = " . $id);
    $row = mysql_fetch_array($res);
    $cnt = $row[0];
В первом варианте мне не нравится выборка всех строк, которые мне не нужны (мне нужно только их количество).
Во втором - не понятно превращение результата в массив: а что будет находиться в $row[1] и т.д.?
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.02.2013, 20:25
Ответы с готовыми решениями:

Определить, сколько в матрице строк, удовлетворяющих условию
Добрый день. Помогите с программой. Определить, сколько в матрице А(8х6) строк, среднее арифметическое значение элементов которых...

Определить номера строк в матрице удовлетворяющих заданному условию
Определите номера строк в матрице, в которых элементов , принадлежащих отрезку , больше, чем элементов принадлежащих отрезкам , ...

Удаление из текстового документа строк, не удовлетворяющих условию
Доброго времени суток. Существует текстовый документ, содержащий большое количество строк (около 5000). В каждой строке помимо текста...

13
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
05.02.2013, 20:34
что бы было меньше затрат памяти и времени не нужно выбирать все поля звездочкой, а выбирать поле с первичным ключом, и вообще звездочку лучше не использовать а перечислять все поля которые выбираете.
Цитата Сообщение от _tvlad Посмотреть сообщение
SELECT * FROM `picture` WHERE `author` = " . $id)
SQL
1
SELECT `id` FROM `picture` WHERE `author` = " . $id
а для второго варианта вместо mysql_fetch_array, используйте mysql_fetch_num

Добавлено через 1 минуту
а по вариантам , даже не знаю, но я склоняюсь к первому, в данном случае
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 20
05.02.2013, 20:57  [ТС]
alpex, спасибо за оперативность.
Про звездочку понял: чем меньше запрашиваешь данных, тем меньше затраты времени и памяти.
Насчет mysql_fetch_num ничего не нашел.
Склоняюсь все-таки ко второму варианту, поскольку первый возвращает ненужную в данном случае для меня информацию, но пока не врубаюсь в логику ответа на запрос SELECT COUNT(*) FROM... Откуда берется массив, если я запрашиваю одно число?
0
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
05.02.2013, 21:07
перепутал mysql_fetch_row
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 20
05.02.2013, 21:22  [ТС]
mysql_fetch_row: "Возвращает массив строк с числовыми индексами, содержащий данные обработанного ряда, или FALSE, если рядов не осталось." - это не то, что нужно. Мне нужно одно число: количество строк (рядов) таблицы, удовлетворяющих некоторому условию.
0
 Аватар для John Jumper
15 / 15 / 3
Регистрация: 20.01.2013
Сообщений: 34
05.02.2013, 21:24
Второй вариант естественно будет работать быстрее поскольку COUNT * используется SQL и его выполнение уже максимально будет оптимизировано, в итоге для построения $res будет использоваться только одно значение, что займет куда меньше времени.

В первом же варианте все кортежи будут занесены в $res, что означает куда более накладное использование времени и памяти.

mysql_fetch_array - это только один из методов интерпретации полученого результата, так же можете воспользоваться mysql_fetch_assoc или же mysql_fetch_row.
1
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 20
05.02.2013, 21:51  [ТС]
Цитата Сообщение от John Jumper Посмотреть сообщение
mysql_fetch_array - это только один из методов интерпретации полученого результата, так же можете воспользоваться mysql_fetch_assoc или же mysql_fetch_row.
Спасибо. Вопрос остается относительно интерпретации результата: COUNT() вроде бы означает одно число, а mysql_fetch_array, mysql_fetch_assoc, mysql_fetch_row - возвращают массив. В чем фишка? Или COUNT() в некоторых случаях может означать массив?
0
 Аватар для John Jumper
15 / 15 / 3
Регистрация: 20.01.2013
Сообщений: 34
05.02.2013, 22:04
Цитата Сообщение от _tvlad Посмотреть сообщение
В чем фишка? Или COUNT() в некоторых случаях может означать массив?
COUNT всегда возвращает число. Но в большинстве случаев возвращаемый результат с БД это несколько элементов, к примеру
SQL
1
SELECT header, text,post_date FROM posts WHERE author ='$author'
и именно по этому функции mysq_fetch интерпретируют данные в массив. Разве это проблема? Просто воспользуйтесь первым элементом массива.
1
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 20
06.02.2013, 14:17  [ТС]
Спасибо, я все понял.
Есть еще один вопрос в продолжение темы. На самом деле, в данном конкретном случае мне нужно получить даже не количество рядов, удовлетворяющих условию, а только факт наличия или отсутствия хотя бы одного такого ряда. Подозреваю, что должен быть способ получить такое булево значение, и выполняться этот запрос должен в среднем быстрее, т.к. в большинстве случаев не будет перелопачивать всю таблицу.
Подскажите, пожалуйста, как должен выглядеть такой запрос.

Добавлено через 5 часов 59 минут
Кажется, вот такой вариант подойдет:
PHP
1
2
3
$res = mysql_query("SELECT `id` FROM `picture` WHERE `author` = " . $id . " LIMIT 1");
if (mysql_num_rows($r) > 0) {
    //...
0
 Аватар для John Jumper
15 / 15 / 3
Регистрация: 20.01.2013
Сообщений: 34
06.02.2013, 15:57
Цитата Сообщение от _tvlad Посмотреть сообщение
выполняться этот запрос должен в среднем быстрее
Конечно же запрос такого типа будет выполняться намного быстрее. Ваш запрос, как по мне, сконструирован правильно, но насколько я помню не все СУБД используют LIMIT.

На всякий пожарный случай, напишем аналогичный запрос но без использования LIMIT.
SQL
1
2
3
SELECT 1
FROM picture
WHERE EXISTS(SELECT * FROM picture WHERE author='$id');
Так же можно данный запрос переделать аналогичным способом используя ANY:

SQL
1
2
3
SELECT 1
FROM picture
WHERE '$id' = ANY(SELECT author FROM picture);
0
 Аватар для alpex
603 / 578 / 103
Регистрация: 16.07.2012
Сообщений: 1,762
06.02.2013, 16:10
Цитата Сообщение от _tvlad Посмотреть сообщение
mysql_query
здесь помоему уже определились с выбором субд
0
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 20
06.02.2013, 16:26  [ТС]
А что означает SELECT 1 и какой результат возвращают эти запросы?
0
 Аватар для John Jumper
15 / 15 / 3
Регистрация: 20.01.2013
Сообщений: 34
06.02.2013, 16:47
Цитата Сообщение от _tvlad Посмотреть сообщение
А что означает SELECT 1 и какой результат возвращают эти запросы?
Насколько я понял вам нужно проверить существует ли в таблице picture хотя бы 1 кортеж где author='$id', эти запросы возвращают единственное значение "1" если это так.
Дальше можете воспользоваться аналогичной проверкой.
Цитата Сообщение от _tvlad Посмотреть сообщение
if (mysql_num_rows($r) > 0)
Эти запросы только альтернатива вашему.
1
1 / 1 / 0
Регистрация: 21.05.2012
Сообщений: 20
06.02.2013, 17:01  [ТС]
Понял, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2013, 17:01
Помогаю со студенческими работами здесь

Найти количество строк|столбцов удовлетворяющих условию
Прошу написать програмку, с пайтоном просто вообще не сталкивалась. Есть матрица чисел типа double. Различные строки (столбцы) матрицы...

Подсчитать количество строк матрицы, удовлетворяющих условию
Уважаемые программисты помогите, пожалуйста!!! нужно решить задачу на С++, а то попрощаюсь с учебой Подсчитайте количество строк матрицы...

Быстрый способ подсчитать количество строк, удовлетворяющих условию
Здравствуйте, подскажите пожалуйста быстрый способ подсчитать количество строк удовлетворяющих условию в очень большом текстовом файле....

Вывести число последовательностей удовлетворяющих условию
Последовательность из l целых чисел b1, b2, ..., bl (1 ≤ b1 ≤ b2 ≤ ... ≤ bl ≤ n) называется хорошей, если каждое число делит без остатка...

В заданной матрице найти суммы элементов строк, удовлетворяющих условию
например есть матрица 2 4 5 4 5 3 8 4 6 6 4 6 1 1 1 2 5 9 9 9 3 4 3 3 1 и если строка начинается с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru