Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица
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 нет возможности сделать.
Неактивен
Неактивен
ой что-то как-то просто оказалось мне аж стыдно vasya спасибо!
Неактивен
а возможно ли в этом запросе сделать так чтобы возвращалось пустое значение или 0 ?
т.к. в результате у меня приезжают 3 строки, то хотелось бы чтобы 3 колонки.
т.е. к примеру тип 0 есть, а 1 и 2 нет, то возвращается верное значение, но если типа 1(или 2) нет, то все кроется медным тазом и не приезжает вообще ничего.
Неактивен
Можно, но оно будет сильно непереносимым и очень плохо расширяемым. Ну и не будет
использовать индексы:
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` != ''
Неактивен
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)
Неактивен
Что-то я потерял нить рассуждений. В чем с вашей точки зрения преимущество трех отдельных запросов?
Как это сочетается с вашим желанием получить результат в три колонки?
Неактивен
vasya написал:
Что-то я потерял нить рассуждений. В чем с вашей точки зрения преимущество трех отдельных запросов?
Как это сочетается с вашим желанием получить результат в три колонки?
меня просто смущает что не будут использоваться индексы. это критично при большом кол-ве данных ? или для простого потсчета это не скажется на производительности ?
Неактивен
При большом кол-ве данных критично, ведь данный запрос производит полный скан таблицы.
Из вашего предложения сделать три отдельных запроса следует, что получения результата именно в три колонки для вас непринципиально. В этом случае вы можете вернуться к варианту с group by, который может использовать индексы.
Неактивен
vasya написал:
При большом кол-ве данных критично, ведь данный запрос производит полный скан таблицы.
Из вашего предложения сделать три отдельных запроса следует, что получения результата именно в три колонки для вас непринципиально. В этом случае вы можете вернуться к варианту с group by, который может использовать индексы.
эммм... наверно криво объяснил... вот именно что в три колонки было бы оптимальным вариантом выборки.
просто попробовав и так и сяк пришел к тому что это единственный верный вариант(3 колонки). но как лучше реализовать при большом объеме данных вот в этом то и затык.
Неактивен
Globulopolis написал:
просто попробовав и так и сяк пришел к тому что это единственный верный вариант(3 колонки).
Вы не правы. Что три колонки, что три строчки это массив и принципиальной разницы нет. Не стоит заставлять MySQL решать не свойственные ей задачи, подгоняя формат выдаваемых данных под имеющийся скрипт.
В зависимости от того как часто происходит данная выборка (в сравнении с изменениями в `gallery`) возможно имеет смысл хранить эту информацию в базе в явном виде, автоматически обновляя при изменении в таблице `gallery`.
Неактивен