как просуммировать результаты COUNT( ) в GROUP BY ?

Лысый

Новичок
как просуммировать результаты COUNT( ) в GROUP BY ?

вот такой запрос

SELECT f.id, f.name, COUNT( i.id ) AS summa
FROM items AS i
LEFT JOIN files AS f ON i.file = f.id
WHERE i.sup =8
GROUP BY i.file
ORDER BY f.name ASC

думаю, всё ясно

группируем по признаку и считаем сколько попало в каждую группу

НО
вопрос
а как получить число всех строк подпавших под WHERE

т.е. COUNT( i.id ) если бы я не группировал
или что ясно из арифметики сумму всех COUNT( i.id ) AS summa

спасибо.
 

Wicked

Новичок
осталось понять, причем тут приведенный выше запрос :)
1) если хочется одновременно получить результаты и этого запроса, а потом еще и сумму, тогда можно попробовать
[SQL]GROUP BY i.file WITH ROLLUP[/SQL]

2) а если надо отдельно, тогда действительно можно без GROUP BY:
[SQL]SELECT f.id, f.name, COUNT( i.id ) AS summa
FROM items AS i
LEFT JOIN files AS f ON i.file = f.id
WHERE i.sup =8
ORDER BY f.name ASC[/SQL]
 

Лысый

Новичок
издеваешься?
если бы да кабы.
я группирую - поэтому в COUNT( i.id ) получаю набор сумм по группам, а не общую сумму

-~{}~ 01.03.06 10:53:

2 Wicked
спасибо
буду разбираться с WITH ROLLUP потому как надо в одном запросе
 

Wicked

Новичок
в том то и был мой вопрос: можно ли из оригинального запроса выкинуть GROUP BY? Ты нигде не говорил, что он тебе нужен для других целей, поэтому первое, что пришло в голову - просто от него избавиться. Будет то что надо.
 

Лысый

Новичок
отлично! расстраивает только то, что с ROLLUP нельзя ORDER BY использовать...
и то что в строке с итогом возникает мусор в полях, пот которым не было ни группировки ни агрегации...

спасибо Wicked !

-~{}~ 01.03.06 11:25:

З.Ы.

ты подумал что посчитать по группам я смог а НЕ группировать не смог? ;) хочется всё одним запросом фигачить ;)
 

Wicked

Новичок
ну насчет мусора:
1) заполнять такие поля бессмысленно
2) надо как-то уметь идентифицировать ROLLUP-строку
 

Лысый

Новичок
ну я придумал вот что

заменил SELECT f.id на SELECT i.file
получается при GROUP BY i.file WITH ROLLUP в последней строке на месте i.file не мусор, как в f.id, а NULL как и обещали в мане

так я её и индентифицирую
 

Wicked

Новичок
вообще-то вместо ID тоже должен был быть null... было по-другому?
 

zerkms

TDD infected
Команда форума
откуда это стремление запихнуть всё в один запрос???????
 

Лысый

Новичок
2 Wicked
угу f.id - там был мусор, как и в name, как я понимаю, значения предыдущей строки, а i.file - NULL, хотя ON i.file = f.id

вот такие интересные наблюдения

2 zerkms
а нафига 2 раза достаточно большую таблицу шерстить, если можно сэкономить?
 

zerkms

TDD infected
Команда форума
Лысый
с какой стати вся таблица будет шерститься???
или индексы уже отменили?
 

Лысый

Новичок
ок ;) ты прав
но всё равно. лишний запрос! лшнее время на соеденение, лишние ресурсы, лишний код! ;)
 

alexhemp

Новичок
Лысый

В двух запросах - лучшая переносимость и читабельность кода. И не факт что кода в 2-х запросах будет бльше, не забывай про логику, вытаскивающую ROLLUP строку.

А вот то, что ROLLUP нет в других SQL серверах (вернее есть схожие не не идентичные механизмы) - это факт, и если придется переходить на другой SQL сервер то головной боли прибавится.
 

Лысый

Новичок
да вобщем то ты прав
но в моем случае я решил так не усложнять - пишу необольную утилитку для анализа инфы инет магазина
никуда это переносится не будет... просто лень кодить много ;)
 
Сверху