Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите оптимизировать SQL запрос, БД MySQL 
:(
    Опции темы
Ant0ha
Дата 16.9.2010, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.3.2009

Репутация: нет
Всего: 2



Основоной запрос для модуля загрузок сайта, объединяю запросы для таблиц папок и файлов, для того чтоб получить количество файлов в папке и количество новых файлов в папке использую 2 вложенных запроса, что не есть хорошо, можно ли как то оптимизировать это дело?

Код

SELECT SQL_CALC_FOUND_ROWS directory_id AS file_id, name, (SELECT 'directory') AS type, (SELECT 'directory') AS file_ext,
                    (SELECT COUNT(*) FROM #__downloads_files AS df WHERE df.path_to_file LIKE CONCAT('%/', dd.directory_id, '/%') AND df.status != 'moderate' AND real_name != '') AS count_files,
                    (SELECT COUNT(*) FROM #__downloads_files AS df WHERE df.path_to_file LIKE CONCAT('%/', dd.directory_id, '/%') AND df.status != 'moderate' AND real_name != '' AND time > UNIX_TIMESTAMP() - 24 * 3600) AS new_day,
                    (SELECT 0) AS real_name,
                    (SELECT 0) AS filesize,
                    (SELECT 0) AS time,
                    (SELECT 0) AS path_to_file,
                    (SELECT 0) AS downloads,
                    (SELECT 0) AS screen1,
                    (SELECT 0) AS about,
                    (SELECT 0) AS previews,
                    position
                    FROM #__downloads_directories AS dd WHERE parent_id = '$directory_id'
 UNION ALL
 SELECT file_id, name, (SELECT 'file') AS type, file_ext,
                    (SELECT 0) AS count_files,
                    (SELECT 0) AS new_day,
                    real_name,
                    filesize,
                    time,
                    path_to_file,
                    downloads,
                    screen1,
                    about,
                    previews,
                    (SELECT 0) AS position
                    FROM #__downloads_files
                    WHERE
                    directory_id = '$directory_id' AND
                    status = 'active' AND
                    real_name != ''
ORDER BY type ASC
LIMIT $this->start, $this->per_page


Это сообщение отредактировал(а) Ant0ha - 16.9.2010, 18:21
PM MAIL   Вверх
Zloxa
Дата 17.9.2010, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Ant0ha @  16.9.2010,  18:20 Найти цитируемый пост)

SELECT SQL_CALC_FOUND_ROWS directory_id AS file_id, name, (SELECT 'directory') AS type, (SELECT 'directory') AS file_ext,
                    (SELECT COUNT(*) FROM #__downloads_files AS df WHERE df.path_to_file LIKE CONCAT('%/', dd.directory_id, '/%') AND df.status != 'moderate' AND real_name != '') AS count_files,
                    (SELECT COUNT(*) FROM #__downloads_files AS df WHERE df.path_to_file LIKE CONCAT('%/', dd.directory_id, '/%') AND df.status != 'moderate' AND real_name != '' AND time > UNIX_TIMESTAMP() - 24 * 3600) AS new_day,
                    (SELECT 0) AS real_name,
                    (SELECT 0) AS filesize,
                    (SELECT 0) AS time,
                    (SELECT 0) AS path_to_file,
                    (SELECT 0) AS downloads,
                    (SELECT 0) AS screen1,
                    (SELECT 0) AS about,
                    (SELECT 0) AS previews,
                    position
                    FROM #__downloads_directories AS dd WHERE parent_id = '$directory_id'

Код

SELECT SQL_CALC_FOUND_ROWS 
      dd.directory_id AS file_id
      , dd.name
      , 'directory' AS type
      , 'directory' AS file_ext
      , COUNT(*)  AS count_files
      , COUNT(case when time > UNIX_TIMESTAMP() - 24 * 3600 then 1 end) AS new_day
      ,0 AS real_name
      ,0 AS filesize
      ,0 AS time
      ,0 AS path_to_file
      ,0 AS downloads
      ,0 AS screen1
      ,0 AS about
      ,0 AS previews
      ,dd.position
      FROM #__downloads_directories AS dd 
      left join #__downloads_files AS df 
        on df.path_to_file LIKE CONCAT('%/', dd.directory_id, '/%') 
           AND df.status != 'moderate' 
           AND real_name != ''
      WHERE dd.parent_id = '$directory_id'
      group by dd.directory_id



Это сообщение отредактировал(а) Zloxa - 17.9.2010, 09:28


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Ant0ha
Дата 17.9.2010, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 25.3.2009

Репутация: нет
Всего: 2



благодарю, ускорился раза в 2
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.5871 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.