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
Форумы портала PHP.SU :: Версия для печати :: Запрос с подсчетом кол-ва строк
Форумы портала PHP.SU » » Работа с СУБД » Запрос с подсчетом кол-ва строк

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

1. antobra - 25 Августа, 2011 - 00:02:42 - перейти к сообщению
Прошу помочь в разборе след. ситуации:

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


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

Цель: экономия сил БД, чтобы не делать второй запрос на подсчет кол-ва найденных строк.
2. DeepVarvar - 25 Августа, 2011 - 00:08:32 - перейти к сообщению
SELECT one,COUNT(*) cnt FROM two WHERE three='four'
(Добавление)
antobra пишет:
pq_numrows
не делает лишний запрос к базе, а подсчитывает количество в полученном результате.
3. antobra - 25 Августа, 2011 - 00:57:20 - перейти к сообщению
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(*).
4. DeepVarvar - 25 Августа, 2011 - 06:44:02 - перейти к сообщению
Уберите алиас "cnt"
5. antobra - 25 Августа, 2011 - 12:51:04 - перейти к сообщению
Это ошибка была без алиаса.

А вот с ним:
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 ?
6. Viper - 25 Августа, 2011 - 12:54:47 - перейти к сообщению
дык вы ж используете агрегацию и вам об это PG написал. GROUP BY вам в помощь
7. antobra - 25 Августа, 2011 - 13:45:04 - перейти к сообщению
Сделал GROUP BY. Запрос работает нормально, за исключением того, что COUNT(*) все равно не выводит кол-во найденных строк.
8. EuGen - 25 Августа, 2011 - 13:58:55 - перейти к сообщению
Сформулируйте точно задачу. Что именно нужно найти. Какое точно количество.
GROUP BY группирует Вам элементы по группам, таким образом COUNT считается по каждой из них.
9. antobra - 28 Августа, 2011 - 16:00:48 - перейти к сообщению
Мой запрос сейчас выглядит так:

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. }


Вот.
10. antobra - 28 Августа, 2011 - 18:24:32 - перейти к сообщению
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 регистронезависмым ? А то сейчас если ввести в запрос "столы" и "Столы" он покажет разный результат.
11. antobra - 28 Августа, 2011 - 20:24:50 - перейти к сообщению
Один вопрос с регистронезависимостью решил. Надо писать не like, а alike. Возможно кому то будет полезно.

Кто подскажет с остальным?
12. EuGen - 29 Августа, 2011 - 09:23:32 - перейти к сообщению
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

А выводить
PHP:
скопировать код в буфер обмена
  1. $query['records_count']
13. antobra - 29 Августа, 2011 - 12:09:08 - перейти к сообщению
EuGen
Спасибо, уточню, а как поступить, когда нужно вывести количество найденных строк до того, как будет цикл (while), а в цикле указыввается: while ($array_query = pg_fetch_array($query) ) { /* text */ }

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

 

Powered by ExBB FM 1.0 RC1