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

Тема в разделе "SQL", создана пользователем vital, 24 мар 2010.

  1. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.470
    Симпатии:
    27
    Вот такие 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]
    в вот такой вот табличке
    Код (Text):
    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 запроса можно всунуть в один? А то такое чувство что я быдлокод ча рожаю.. Да и многовато это запросов в бд для одной странички, ради мелкой фигни..
     
  2. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    через conditional count можно попробовать, но на сколько я знаю mysql его не поодерживает. но его (conditional count) можно с емулировать через sum
     
  3. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.470
    Симпатии:
    27
    А теперь я признаюсь в ламерстве и прошу ссылку..
     
  4. Kmet

    Kmet Well-Known Member

    Регистрация:
    25 май 2006
    Сообщения:
    1.017
    Симпатии:
    1
    тут на примере легче показать, я не специлист в 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
     
  5. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.470
    Симпатии:
    27
    Вроде да

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

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.470
    Симпатии:
    27
    Пришел 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.
    Фильтровать их долго получается.
     
  8. Гость

    Блин попробовал никак не понял куда это услове писать.
    Использую Firebird.
    Подскажите на этом же примере пожалуйста
     
  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 применима похоже только в хранимых процедурах
     
Загрузка...

Поделиться этой страницей