Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [mySQL] выборка COUNT'ов с GROUP BY 
V
    Опции темы
Acrobat
Дата 13.5.2008, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.4.2007

Репутация: нет
Всего: нет



Приветствую, такая проблема:
есть таблица, допустим товаров, у каждого товара есть статус от 1 до 5. т.е. мы получаем такую таблицу id, name, status
как мне составить запрос, чтобы выбрать количество всех товаров с группировкой по статусу так, чтобы если у меня нет товаров со статусом 2 запрос вернул количество 0?
т.е. в конечном итоге должно получиться что то вроде:
со статусом 1 - [количество]
со статусом 2 - [количество]
....
со статусом 5 - [количество]

Это нужно для статистики.
Запросом:
Код

SELECT COUNT(*) FROM table GROUP BY status

у меня не получается...
Заранее спасибо за помощь=)

ЗЫ: среда программирования php
PM MAIL   Вверх
Magnifico
Дата 13.5.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



а как изходя из твоей таблицы( id, name, status)
может существовать запись 
с со стаусом 2 но без id и name
т.е
Цитата

1, Морковка, 1
2,Картошка , 1
 ,     , 2

есть подозрения что у тебя там более сложная структура таблиц

Это сообщение отредактировал(а) Magnifico - 13.5.2008, 14:57


--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Magnifico
Дата 13.5.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



Код

SELECT status , COUNT(*) as Количество  FROM @table GROUP BY status
union all
SELECT 2 as status , 0 as Количество 



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Acrobat
Дата 13.5.2008, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.4.2007

Репутация: нет
Всего: нет



нет, мне нужно только показать все статусы и сколько по ним данных, например:

со статусом 1 - [количество]
со статусом 2 - [количество]
....
со статусом 5 - [количество]

Имена не нужны, зря конечно я их в пример таблицы включил.
PM MAIL   Вверх
Akina
Дата 13.5.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Код

SELECT q1.status, Count(MyTable.id) AS Count
FROM MyTable 
RIGHT JOIN 
(
SELECT MyTable.status
FROM MyTable
GROUP BY MyTable.status
) As q1 
ON MyTable.status = q1.status
GROUP BY q1.status

Само собой если в таблице какого-то статуса ВООБЩЕ нет - его не будет и в результирущей выборке.
Правильно же - создать таблицу статусов, в которой содержатся все возможные значения. И джойнить её вместо подзапроса.
PS. Кавычки расставляй сам.

Это сообщение отредактировал(а) Akina - 13.5.2008, 20:17


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Magnifico
Дата 13.5.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



Цитата

у каждого товара есть статус от 1 до 5. 
 чтобы если у меня нет товаров со статусом 2 запрос вернул количество 0?

Код

create table Mytable 
(
id int, 
[name] nvarchar(25), 
status int
)
-------------------------------------------
insert into Mytable
select 1,'aaa',1 union all
select 1,'bbb',1 union all
select 2,'ddd',1 union all
select 2,'fff',3 union all
select 3,'ggg',3 union all
select 3,'hhh',3 union all
select 4,'iii',4 

----------------------------------------
SELECT  status , COUNT(*) as Количество  FROM Mytable GROUP BY status
union 
SELECT 
case when not exists(select * from MyTable where status =1 ) then 1 
when not exists(select * from MyTable where status =2 ) then 2 
when not exists(select * from MyTable where status =3 ) then 3
when not exists(select * from MyTable where status =4) then 4
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  
union 
SELECT case 
when not exists(select * from MyTable where status =2 ) then 2 
when not exists(select * from MyTable where status =3 ) then 3
when not exists(select * from MyTable where status =4) then 4
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  
union 
SELECT case 
when not exists(select * from MyTable where status =3 ) then 3
when not exists(select * from MyTable where status =4) then 4
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  
union 
SELECT case 
when not exists(select * from MyTable where status =4) then 4
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  
union 
SELECT case 
when not exists(select * from MyTable where status =5 ) then 5
end  
, 0 as Количество  



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
Acrobat
Дата 13.5.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.4.2007

Репутация: нет
Всего: нет



Magnifico, а не слишком много запросов получилось?

Akina, чем отличается твой последний запрос от, например моего?
Код

SELECT COUNT(*) FROM table GROUP BY status

PM MAIL   Вверх
Akina
Дата 13.5.2008, 23:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Acrobat @  13.5.2008,  21:49 Найти цитируемый пост)
чем отличается твой последний запрос от, например моего?

Независимостью от диалекта. 
 smile По-моему, только MySQL отличается этой идиотской особенностью - пихает что ни попадя в Group By и смешивает поля из разных записей при группировке.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Deniz
Дата 14.5.2008, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 6
Всего: 44



Magnifico, что-то сложный запрос получился, может лучше
Код

select 1, count(*) from MyTable where status = 1
union
select 2, count(*) from MyTable where status = 2
union
select 3, count(*) from MyTable where status = 3
union
select 4, count(*) from MyTable where status = 4
union
select 5, count(*) from MyTable where status = 5


Добавлено через 52 секунды
А вообще
Цитата(Akina @  13.5.2008,  21:04 Найти цитируемый пост)
Правильно же - создать таблицу статусов, в которой содержатся все возможные значения. И джойнить её вместо подзапроса.




--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Acrobat
Дата 14.5.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 4.4.2007

Репутация: нет
Всего: нет



Всем спасибо за ответы, многое понял)
PM MAIL   Вверх
Magnifico
Дата 14.5.2008, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 418
Регистрация: 23.1.2008
Где: Московская област ь

Репутация: 4
Всего: 17



Цитата

Magnifico, а не слишком много запросов получилось?

Да слишком - но это то что первое в голову пришло (а для оптимизаци нужно время )
тем более  DENIZ тебе уже дал более оптимизированный запрос

Deniz  +1



--------------------
Всё  в  порядке   -   спасибо  зарядке  !
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.1063 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.