• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы vital
  • Дата начала
V

vital

Вот такие 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
25.05.2006
904
8
BIT
0
через conditional count можно попробовать, но на сколько я знаю mysql его не поодерживает. но его (conditional count) можно с емулировать через sum
 
V

vital

А теперь я признаюсь в ламерстве и прошу ссылку..
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
тут на примере легче показать, я не специлист в 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
 
V

vital

Вроде да

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

vital

Пришел sax_ol и поставил все на свои места. Спасибо, мне знаний синтаксиса не хватило, хотя знал, что как-то так можно(
 
G

Guest

Подскажите еще мне пожалуйста. Есть таблица 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.
Фильтровать их долго получается.
 
G

Guest

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

Guest

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

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

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!