SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.09.2009 10:01:26

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

3 count в одной таблице ?!

Есть таблица
CREATE TABLE `gallery` (
  `ga_id` int(11) NOT NULL AUTO_INCREMENT,
  `ga_mid` int(11) NOT NULL DEFAULT '1',
  `ga_thumbs` varchar(255) NOT NULL DEFAULT 'images/nocover.png',
  `ga_images` varchar(255) NOT NULL DEFAULT 'images/nocover.png',
  `ga_type` smallint(1) NOT NULL DEFAULT '0',
  `ga_image_size` varchar(7) NOT NULL DEFAULT '',
  `ga_published` smallint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ga_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

в поле ga_type хранится тип изображения (от 0 до 2)
мне нужно посчитать кол-во изображений для каждого типа. для 2 count делаю через UNION

SELECT * FROM
(SELECT COUNT(`ga_images`) AS num_fr FROM `gallery` WHERE `ga_mid` = '1' AND `ga_images` != '' AND `ga_type` = 0
UNION ALL
SELECT COUNT(`ga_images`) AS num_ps FROM `gallery` WHERE `ga_mid` = '1' AND `ga_images` != '' AND `ga_type` = 1)
AS cdata


а вот дальше непойму как сделать. через views нет возможности сделать.

Неактивен

 

#2 17.09.2009 10:34:52

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: 3 count в одной таблице ?!

SELECT COUNT(*) AS num_fr FROM `gallery` WHERE `ga_mid` = '1' AND `ga_images` != '' group by ga_type;

Неактивен

 

#3 17.09.2009 11:14:47

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: 3 count в одной таблице ?!

ой smile что-то как-то просто оказалось smile мне аж стыдно smile vasya спасибо!

Неактивен

 

#4 17.09.2009 15:05:20

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: 3 count в одной таблице ?!

а возможно ли в этом запросе сделать так чтобы возвращалось пустое значение или 0 ?
т.к. в результате у меня приезжают 3 строки, то хотелось бы чтобы 3 колонки.

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

Неактивен

 

#5 17.09.2009 15:16:40

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: 3 count в одной таблице ?!

Можно, но оно будет сильно непереносимым и очень плохо расширяемым. Ну и не будет
использовать индексы:

SELECT SUM(IF(ga_type=1,1,0)) gt1, SUM(IF(ga_type=2,1,0)) gt2, SUM(IF(ga_type=3,1,0)) gt3
FROM gallery
WHERE `ga_mid` = '1' AND `ga_images` != ''

Неактивен

 

#6 17.09.2009 15:48:44

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: 3 count в одной таблице ?!

paulus написал:

Можно, но оно будет сильно непереносимым и очень плохо расширяемым. Ну и не будет
использовать индексы:

SELECT SUM(IF(ga_type=1,1,0)) gt1, SUM(IF(ga_type=2,1,0)) gt2, SUM(IF(ga_type=3,1,0)) gt3
FROM gallery
WHERE `ga_mid` = '1' AND `ga_images` != ''

а как вариант если сделать 3 отдельных запроса, то сильно ли будет "тормозить" к примеру при размере базы в сотню тысяч строк ?

PS! В принципе расширяемость тут не особо играет роль, т.к. таблица будет только одна и типов всего 3.

Отредактированно Globulopolis (17.09.2009 15:50:30)

Неактивен

 

#7 17.09.2009 18:08:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: 3 count в одной таблице ?!

Что-то я потерял нить рассуждений. В чем с вашей точки зрения преимущество трех отдельных запросов?
Как это сочетается с вашим желанием получить результат в три колонки?

Неактивен

 

#8 18.09.2009 08:29:08

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: 3 count в одной таблице ?!

vasya написал:

Что-то я потерял нить рассуждений. В чем с вашей точки зрения преимущество трех отдельных запросов?
Как это сочетается с вашим желанием получить результат в три колонки?

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

Неактивен

 

#9 18.09.2009 09:57:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: 3 count в одной таблице ?!

При большом кол-ве данных критично, ведь данный запрос производит полный скан таблицы.

Из вашего предложения сделать три отдельных запроса следует, что получения результата именно в три колонки для вас непринципиально. В этом случае вы можете вернуться к варианту с group by, который может использовать индексы.

Неактивен

 

#10 18.09.2009 10:01:26

Globulopolis
Участник
Зарегистрирован: 17.09.2009
Сообщений: 23

Re: 3 count в одной таблице ?!

vasya написал:

При большом кол-ве данных критично, ведь данный запрос производит полный скан таблицы.

Из вашего предложения сделать три отдельных запроса следует, что получения результата именно в три колонки для вас непринципиально. В этом случае вы можете вернуться к варианту с group by, который может использовать индексы.

эммм... наверно криво объяснил... вот именно что в три колонки было бы оптимальным вариантом выборки.
просто попробовав и так и сяк пришел к тому что это единственный верный вариант(3 колонки). но как лучше реализовать при большом объеме данных вот в этом то и затык.

Неактивен

 

#11 18.09.2009 10:45:56

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: 3 count в одной таблице ?!

Globulopolis написал:

просто попробовав и так и сяк пришел к тому что это единственный верный вариант(3 колонки).

Вы не правы. Что три колонки, что три строчки это массив и принципиальной разницы нет. Не стоит заставлять MySQL решать не свойственные ей задачи, подгоняя формат выдаваемых данных под имеющийся скрипт.


В зависимости от того как часто происходит данная выборка (в сравнении с изменениями в `gallery`) возможно имеет смысл хранить эту информацию в базе в явном виде, автоматически обновляя при изменении в таблице `gallery`.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson