Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Реально ли оптимизировать запрос?


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

Таблица 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"
    )
);

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

Заранее благодарю.

Автор: Kesh 28.3.2009, 12:44
Попробуйте outer join

Автор: Smith312 28.3.2009, 13:21
можно пример кодом, что именно вы имели ввиду?

Автор: Smith312 29.3.2009, 21:54
Могу дать 3WMZ тому кто предложит лучший вариант оптимизации.

Автор: skyboy 29.3.2009, 23:16
Цитата(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(поискай в гугле) как альтернативу структуры хранения и выборки. возможно, тебе больше подойдет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)