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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Реально ли оптимизировать запрос? 
:(
    Опции темы
Smith312
  Дата 28.3.2009, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день, хотел проконсультироваться у знающих людей, реально ли оптимизировать данный запрос ?

Таблица test где продемонстрирована иерархия разделов.
parent_id - идентификатор раздела РОДИТЕЛЯ

+----+-------------+-------------+
| id | name         | parent_id |
+----+-------------+-------------+
|  1 | aa             | NULL        |
|  2 | bb             |              1 |
|  3 | cc              |              2 |
|  4 | cc              | NULL        |
|  5 | dd             |              4 |
|  6 | ee             |              5 |
+----+------------+-------------+

Допустим нужно выбрать раздел cc который относится к разделу bb который в свою очередь относится к разделу aa.

Мой вариант запроса:

select * from test where `name`='cc' and `parent_id`=(
    select id from test where `name`='bb' and `parent_id`=(
        select id from test where `name`="aa"
    )
);

Есть ли иные пути создания запроса, можно ли укоротить запись или сделать ее выполнение быстрее чем в данном примере?

Заранее благодарю.
PM MAIL   Вверх
Kesh
Дата 28.3.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Попробуйте outer join


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Smith312
  Дата 28.3.2009, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



можно пример кодом, что именно вы имели ввиду?
PM MAIL   Вверх
Smith312
Дата 29.3.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Могу дать 3WMZ тому кто предложит лучший вариант оптимизации.
PM MAIL   Вверх
skyboy
Дата 29.3.2009, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



Цитата(Smith312 @  28.3.2009,  11:33 Найти цитируемый пост)
Мой вариант запроса:

select * from test where `name`='cc' and `parent_id`=(
    select id from test where `name`='bb' and `parent_id`=(
        select id from test where `name`="aa"
    )
);

достаточно громоздко, хотя можно применить explain - скорее всего, оптимизитор нормально  обработает все эти подзапрсы. но всяко лучше join на саму себя, чем эти вложенные подзапросы:
Код

SELECT t0.*
FROM test as t0
INNER JOIN test as t1
ON t0.parent_id = t1.id
INNER JOIN test as t2
ON t1.parent_id = t2.id
WHERE t0.name = "cc" AND t1.name = "bb" AND t2.name = "aa"

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


 




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


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

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