Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Запрос с подсчетом кол-ва строк

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
antobra
Отправлено: 25 Августа, 2011 - 00:02:42
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




Прошу помочь в разборе след. ситуации:

Есть запрос:
PHP:
скопировать код в буфер обмена
  1. pq_query("SELECT one FROM two WHERE three='four' LIMIT 5 ");


Необходимо сделать подсчет кол-ва найденных строк. Это можно сделать с помощью pq_numrows, но он покажет, что нашел 5. А как из этого же запроса сделать подсчет кол-ва всех найденных строк по данному запросу.

Цель: экономия сил БД, чтобы не делать второй запрос на подсчет кол-ва найденных строк.
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Августа, 2011 - 00:08:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




SELECT one,COUNT(*) cnt FROM two WHERE three='four'
(Добавление)
antobra пишет:
pq_numrows
не делает лишний запрос к базе, а подсчитывает количество в полученном результате.
 
 Top
antobra
Отправлено: 25 Августа, 2011 - 00:57:20
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




Warning: pg_query() [function.pg-query]: Query failed: ERROR: column "two" must appear in the GROUP BY clause or be used in an aggregate function in one.php on line 31

Стал писать вот такое после того, как вставил count(*).
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Августа, 2011 - 06:44:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Уберите алиас "cnt"
 
 Top
antobra
Отправлено: 25 Августа, 2011 - 12:51:04
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




Это ошибка была без алиаса.

А вот с ним:
Warning: pg_query() [function.pg-query]: Query failed: ERROR: syntax error at or near "cnt" LINE 1: ... datetime, count(*) cnt FROM o... ^ in one.php on line 31

Странно, хм.
Это может быть связано с тем, что конкретно уточняется в WHERE ?
 
 Top
Viper
Отправлено: 25 Августа, 2011 - 12:54:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




дык вы ж используете агрегацию и вам об это PG написал. GROUP BY вам в помощь


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
antobra
Отправлено: 25 Августа, 2011 - 13:45:04
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




Сделал GROUP BY. Запрос работает нормально, за исключением того, что COUNT(*) все равно не выводит кол-во найденных строк.
 
 Top
EuGen Администратор
Отправлено: 25 Августа, 2011 - 13:58:55
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Сформулируйте точно задачу. Что именно нужно найти. Какое точно количество.
GROUP BY группирует Вам элементы по группам, таким образом COUNT считается по каждой из них.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
antobra
Отправлено: 28 Августа, 2011 - 16:00:48
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




Мой запрос сейчас выглядит так:

PHP:
скопировать код в буфер обмена
  1. $query = pq_query("SELECT one, two, COUNT(*) FROM table WHERE one LIKE $ask OR two LIKE $ask GROUP BY one, two ORDER by one DESC LIMIT 8");


Мне нужно вывести до цикла WHILE:

PHP:
скопировать код в буфер обмена
  1. while ($query2 = pg_fetch_array($query)) {
  2.   echo $query2['one'].' '.$query2['two'];
  3. }


Вот.
 
 Top
antobra
Отправлено: 28 Августа, 2011 - 18:24:32
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




antobra пишет:
Мой запрос сейчас выглядит так:

PHP:
скопировать код в буфер обмена
  1. $query = pq_query("SELECT one, two, COUNT(*) FROM table WHERE one LIKE $ask OR two LIKE $ask GROUP BY one, two ORDER by one DESC LIMIT 8");


Далее пишется, что нашлось столько то строк echo $query[COUNT(*).

Далее цикл, который все выводит
PHP:
скопировать код в буфер обмена
  1. while ($query2 = pg_fetch_array($query)) {
  2.   echo $query2['one'].' '.$query2['two'];
  3. }


Нужно вот такое, но количество найденного все равно не выводится.


И еще вопрос. Как сделать запрос LIKE регистронезависмым ? А то сейчас если ввести в запрос "столы" и "Столы" он покажет разный результат.
 
 Top
antobra
Отправлено: 28 Августа, 2011 - 20:24:50
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




Один вопрос с регистронезависимостью решил. Надо писать не like, а alike. Возможно кому то будет полезно.

Кто подскажет с остальным?

(Отредактировано автором: 28 Августа, 2011 - 21:52:13)

 
 Top
EuGen Администратор
Отправлено: 29 Августа, 2011 - 09:23:32
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT one, two, COUNT(*) AS records_count FROM TABLE WHERE one LIKE $ask OR two LIKE $ask GROUP BY one, two ORDER BY one DESC LIMIT 8

А выводить


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
antobra
Отправлено: 29 Августа, 2011 - 12:09:08
Post Id


Посетитель


Покинул форум
Сообщений всего: 327
Дата рег-ции: Окт. 2010  


Помог: 1 раз(а)




EuGen
Спасибо, уточню, а как поступить, когда нужно вывести количество найденных строк до того, как будет цикл (while), а в цикле указыввается: while ($array_query = pg_fetch_array($query) ) { /* text */ }

Я к тому, что нельзя вывести количество с помощью $query['records_count'] пока не сделаешь pg_fetch_array. Верно? А количество найденного в цикле выводить не нужно, нужно до него.
 
 Top
EuGen Администратор
Отправлено: 29 Августа, 2011 - 12:14:23
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Так без цикла выводить нет смысла - у Вас ведь не будет общего количества. records_count будет привязано к конкретной группе.
Чтобы выбрать общее количество, сделайте отдельный запрос.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB