Оптимизируем запрос

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#1
Вот такие 3 запроса
<!--shcode--><pre><code class='sql'>SELECT count(id)as n FROM Post WHERE Approoved='Yes' and Data='Дата-такая-то';
SELECT count(id)as n FROM Post WHERE Approoved='Yes';
SELECT count(id)as n FROM Post WHERE Approoved='No';[/CODE]
в вот такой вот табличке
Код:
CREATE TABLE `Post` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(150) COLLATE cp1251_bin NOT NULL,
`Path` varchar(150) COLLATE cp1251_bin NOT NULL,
`Rate` int(11) NOT NULL,
`Data` date NOT NULL,
`Approoved` enum('Yes','No') COLLATE cp1251_bin NOT NULL,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COLLATE=cp1251_bin AUTO_INCREMENT=1;
Так вот, те 3 запроса можно всунуть в один? А то такое чувство что я быдлокод ча рожаю.. Да и многовато это запросов в бд для одной странички, ради мелкой фигни..
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#2
через conditional count можно попробовать, но на сколько я знаю mysql его не поодерживает. но его (conditional count) можно с емулировать через sum
 

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#3
А теперь я признаюсь в ламерстве и прошу ссылку..
 

Kmet

Well-Known Member
Java Team
25.05.2006
1 036
8
#4
тут на примере легче показать, я не специлист в mysql синтаксисе, но думаю принцип будет понятен

SELECT sum (IF Approoved='Yes' Then 1 Else 0 EndIf)as n , sum (IF Approoved='No' Then 1 Else 0 EndIf)as c FROM Post
 

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#5
Вроде да

Добавлено: С учетом правок под mysql выйдет
Код:
SELECT sum( IF( Approoved = 'Yes', 1, 0 ) ) AS n, sum( IF( Approoved = 'No', 1, 0 ) ) AS c
FROM Post
Спасибо.
 

vital

Больной Компом Детектед
29.01.2006
2 432
40
codeby.net
#6
Пришел sax_ol и поставил все на свои места. Спасибо, мне знаний синтаксиса не хватило, хотя знал, что как-то так можно(
 

Гость
#7
Подскажите еще мне пожалуйста. Есть таблица DEV_ID с полем ID, значения в поле такие:10;20;30;40;50;60;70;80.
Мне нужно выбратть из таблицы значения от 10 до 80 с шагом 20 (результат должен быть 10;30;50;70).
Очень желательно сделать это в одном запросе. Сейчас делаю так:

SELECT ID FROM DEV_ID WHERE ID>=10 AND ID<=70.

Получаю все 7 значений в диапазоне от 10 до 70,а затем в программе уже их анализирую и фильтрую.
Можно ли установить в запросе шаг диапазона,а то бывает запрос отдает до 100 000 значений,а использовать нужно 50 000.
Фильтровать их долго получается.
 

Гость
#9
SELECT ID FROM DEV_ID WHERE ID>=10 AND ID<=70 AND IF(ID%2)
не работает,ошибка SQL, и нигде в литературе ничего подобного не нашел.
Может у вас есть мнение или версия запроса.
 

Гость
#10
Если кому интересно, сработало вот так:

SELECT ID FROM DEV_ID WHERE ID>=10 AND ID<=70 AND NOT(ID - ((ID /20)*20) = 0)

Похоже в Firebird конструкция IF THEN ELSE применима похоже только в хранимых процедурах