select count(*) - можно обьединить в один запрос?

Corvin

Новичок
select count(*) - можно обьединить в один запрос?

Как-то можно объединить все в один запрос?
----------------------------------------------------------------
select count(*) from a_firms_main WHERE cat_id=1
select count(*) from a_firms_main WHERE cat_id=2
select count(*) from a_firms_main WHERE cat_id=3
select count(*) from a_firms_main WHERE cat_id=4
select count(*) from a_firms_main WHERE cat_id=5
select count(*) from a_firms_main WHERE cat_id=6
...................
 

.des.

Поставил пиво кому надо ;-)
Код:
SELECT 
     COUNT(cat_id=1,1,NULL)  AS c1,
     COUNT(cat_id=2,1,NULL)  AS c2,
     ....
FROM a_firms_main 
WHERE cat_id IN (1,2,3...)
 

Three Daws

Guest
select cat_id, count(1) from a_firms_main group by cat_id

если, конечно, Вы пытаетесь получить именно количество записей для каждого уникального значения cat_id из таблицы a_firms_main. Думаю, что значение cat_id будет не лишним в выборке.

.des.
насчет пива верно подмечено, ага
 

Falc

Новичок
Если быть более точным то:

SELECT cat_id, COUNT(*)
FROM a_firms_main
WHERE cat_id IN (1,2,3...)
GROUP BY cat_id
 

Фанат

oncle terrible
Команда форума
Falc
есть мнение, что ты недотелепал
посему потрудись приписать объяснение словами, что ты буквально понял приведенный кусок кода, и что твой пример - это всего лишь частный случай, и делать так обычно не имеет смысла
 

Three Daws

Guest
HEm
а зачем больше-то? достаточно посчитать количество записей, ничего от них не запрашивая. Ну и вкатите в count константу, чтобы он на это не тратился. А количество записей он просуммирует за счет группировки. Просто поверьте на слово.

Хотя... Сейчас Falc пояснит что это чушь, у него этого не наблюдается. Заодно - просветит меня как надо воспринимать на ЭТОМ ФОРУМЕ вопросы вида
Код:
строка 1
строка 2
строка 3
[b]...[/b]
Я, грешным делом, думаю что "..." значит - продолжаем для все значений cat_id

Просто я думаю, что если бы множество значений cat_id было перечислимым, написали бы так:
Код:
строка 1
строка 2
строка 3
[b]...[/b]
строка [b]N[/b]
И я бы ТОГДА тоже подумал о том, чтобы указать нужные cat_id в виде WHERE cat_id IN (1,...,N)

Но фиг его знает. Почему-то местные санитары уверены, что трактовать надо именно так. Может они (санитары) пояснят ход своих мыслей.

Ибо лично я не в курсе тайного способа, как перечислить ВСЕ возможные значения cat_id в виде указания IN ([in]set[/i]).

P.S.
да-да у меня в голове каша и я много читаю. Но все равно не знаю как указать таким образом ВСЕ значения в таблице, кроме как предварительно выбрав их. И я все равно не знаю ЗАЧЕМ указывать ВСЕ значения в виде IN (...)

P.P.S. 2 Falc
скажите, Вы тоже относитесь к людям, которые проверяют есть ли в базе данных таблица "A" командой
Код:
  DROP TABLE A
Если сработало, значит таблица "A" в базе была, ага?
 

Tigr

Новичок
select cat_id, count(1) from a_firms_main group by cat_id - и о чем вы тут спорите, не понятно
 

Three Daws

Guest
Автор оригинала: Tigr
select cat_id, count(1) from a_firms_main group by cat_id - и о чем вы тут спорите, не понятно
а чем, кроме показываемого имени автора, эта строка отличается от моей:
Код:
select cat_id, count(1) from a_firms_main group by cat_id
?

лично я - получаю удовольствие.
 

Tigr

Новичок
Я написал о чем здесь спорить, а слово "ЗДЕСЬ" ссылается на твой код "select cat_id, count(1) from a_firms_main group by cat_id" чтобы было понятно очем я говорю

И надо думать, а не получать удовольствие от неуместной иронии
 

Three Daws

Guest
2 Tigr
над самим вопросом я подумал, перед тем как написал свой ответ.

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

пока ни что не дало мне повода думать над ответом санитара без иронии.

как только автор вопроса заявит, что он имел ввиду перечислимое количество значений cat_id, я сразу стану серьезен и посыплю голову пеплом.

с точки зрения нового человека на форуме, ответ человека со статусом "санитара" априори будет иметь больший вес, чем ответ "новичка" (это аспект не программирования, а психологии). Поэтому я склонен именно иронизировать
 

Falc

Новичок
Three Daws, Tigr

А никто и не спорит, я просто уточнил.

А использовать COUNT(1), не хорошо, так как есть общепринятый синтаксис.
 

Three Daws

Guest
Автор оригинала: Falc
Three Daws, Tigr

А никто и не спорит, я просто уточнил.

А использовать COUNT(1), не хорошо, так как есть общепринятый синтаксис.
Поясните, что именно Вы уточнили и в чем смысл уточнения?

Мы оба говорим вот об этом:
Код:
SELECT cat_id, COUNT(*)
FROM a_firms_main
WHERE cat_id IN (1,2,3...)
GROUP BY cat_id
Или Вы имеете ввиду что-то иное?

Если об этом, то в чем уточнение? Вы реально предлагаете перечислить все возможные значения cat_id? Как? Зачем?

Или я неверно понимаю способ задания вопросов, или Вы, по недоступным мне признакам, лучше меня понимаете, что речь идет о ПЕРЕЧИСЛИМОМ ряде 1,2,3,...,N значений cat_id. В этом случае - приношу свои извинения, но я не в силах постичь те признаки вопроса, по которым можно сделать это предположение.

использовать COUNT(1) хорошо, ибо снижает ресурсоемкость. Не противоречит синтаксису диалекта сиквела, принятого в MySQL.

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

Corvin

Новичок
Спасибо за помощь все ок.
Простите мое невежество, но что означает "1" в COUNT(1) ?
 

Falc

Новичок
Three Daws

>>Поясните, что именно Вы уточнили и в чем смысл уточнения?

Человек привел запросы которые хочет привести к одному, так как у него cat_id были перечислины, я тоже их перечислил. а заодно поправил менее наглядный синтаксис "COUNT(1)".


>>использовать COUNT(1) хорошо, ибо снижает ресурсоемкость.

Кто тебе об этом сказал?

-~{}~ 03.06.04 14:17:

Corvin
>>Простите мое невежество, но что означает "1" в COUNT(1) ?
Пиши COUNT(*), и не возникнет подобных вопросов :)
 

Three Daws

Guest
Falc
1. В конце перечисления строк вида SELECT стоит многоточие.

Как Вы это воспринимаете, трактуете? Просто не заметили? Упустили из виду?

2. Впервые использование count(1) встретил несколько лет назад у Котерова.

Собственные эксперименты на запросах к таблицам с порядком записей выше 40 000 для MySQL 3-ей версии и статьи по оптимизации запросов дополнительно в этом убедили. Один из принципов оптимизации запросов - не запрашивайте лишнюю информацию и не заставляйте СУБД делать лишние действия.

OffTopic

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

В Сети обращение "ты" более принято и уже не несет в себе ни доверительную нагрузку, ни подавляющий фактор, вроде "А ну иди сюда, ты, блин...".
 

HEm

Сетевой бобер
Автор оригинала: Three Daws
HEm
а зачем больше-то? достаточно посчитать количество записей, ничего от них не запрашивая. Ну и вкатите в count константу, чтобы он на это не тратился. А количество записей он просуммирует за счет группировки. Просто поверьте на слово.
Вот последнее предложение мне не нравится. В мане ( http://dev.mysql.com/doc/mysql/ru/Group_by_functions.html ) я не вижу предложения оптимизировать запросы таким образом. Вполне может быть что этим просто пренебрегли, а может так делать не надо. Я так полагаю, Вы этот приемчик вычислили эмпирически, вполне возможно что он очень даже хорош, а может быть есть ситуации, в которых он неприемлем, вот это я и хочу узнать.

-~{}~ 03.06.04 14:56:

кстати, сначала я тут хотел написать "ты", потом увидел слово "вкатите" и на всякий случай написал на "Вы", а после постинга увидел предыдущий комментарий ;)
 

Three Daws

Guest
Если судить по документации к MySQL-ю, то вызов count(*) должен выполняться практически без торможения, но в реальности - это не всегда так.

Кстати! Вариант COUNT(1) может работать медленнее при наличии в таблице полей типа BLOB. Есть такое дело, признаю.
 
Сверху