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

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

  1. vital

    vital Больной Компом Детектед

    Репутация:
    0
    Регистрация:
    29 янв 2006
    Сообщения:
    2.434
    Симпатии:
    39
    Вот такие 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
    Java Team

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

    vital Больной Компом Детектед

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

    Kmet Well-Known Member
    Java Team

    Репутация:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    1.034
    Симпатии:
    7
    тут на примере легче показать, я не специлист в 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 Больной Компом Детектед

    Репутация:
    0
    Регистрация:
    29 янв 2006
    Сообщения:
    2.434
    Симпатии:
    39
    Вроде да

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

    vital Больной Компом Детектед

    Репутация:
    0
    Регистрация:
    29 янв 2006
    Сообщения:
    2.434
    Симпатии:
    39
    Пришел sax_ol и поставил все на свои места. Спасибо, мне знаний синтаксиса не хватило, хотя знал, что как-то так можно(
     
  7. Гость

    Репутация:
    0
    Подскажите еще мне пожалуйста. Есть таблица 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. Гость

    Репутация:
    0
    Блин попробовал никак не понял куда это услове писать.
    Использую Firebird.
    Подскажите на этом же примере пожалуйста
     
  9. Гость

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

    Репутация:
    0
    Если кому интересно, сработало вот так:

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

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

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