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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [MySQL] Оптимизация LEFT JOIN 
V
    Опции темы
MoLeX
Дата 29.2.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Добрый день.
Сейчас у меня есть такой запрос
Код

SELECT `tree`.*, `wo`.`org`, `wd`.`dev`
FROM `tree` as `tree`         
   LEFT OUTER JOIN `w_org` as `wo` ON (`tree`.`id_name` = `wo`.`id`)        
   LEFT OUTER JOIN `w_dev` as `wd` ON (`tree`.`id_name` = `wd`.`id`)             
WHERE `tree`.`lid` >= 1 AND `tree`.`rid` <= 18 AND IF(0, `tree`.`level` < 0, 1) 
   ORDER BY `tree`.`lid` ASC


в итоге получаю:
id | level |  org  |  dev
-------------------------
 1     0       null      null
 2     1         A       null
 3     1         B       null
 4     2       null      AA
 5     2       null      AB

и в коде уже делаю проверку по level
Код

$name = '';
if( $sql->level == 1 )
   $name = $sql->org;
if( $sql->level == 2 )
   $name = $sql->dev;


Есть ли возможность данное дело оптимизировать? Хотелось бы если level = 1 то один LEFT JOIN, если level = 2 то другой LEFT JOIN выполнить


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
Akina
Дата 29.2.2012, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

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



Цитата(MoLeX @  29.2.2012,  10:25 Найти цитируемый пост)
в итоге получаю:

Вывод не соответствует запросу.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 29.2.2012, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


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

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



Код

SELECT ....., case when level = 1 then `wo`.`org` when level = 2 then `wd`.`dev` end as `name`
from....

Ну или вместо кейса if

Еще как вариант
Код

SELECT `tree`.*--, `wo`.`org`, `wd`.`dev`
   ,coalesce(`wo`.`org`,`wd`.`dev`) as `name`
FROM `tree` as `tree`         
   LEFT OUTER JOIN `w_org` as `wo` ON (`tree`.`id_name` = `wo`.`id`)  and `tree`.`level` = 1
   LEFT OUTER JOIN `w_dev` as `wd` ON (`tree`.`id_name` = `wd`.`id`)  and `tree`.`level` = 2           
WHERE `tree`.`lid` >= 1 AND `tree`.`rid` <= 18 AND IF(0, `tree`.`level` < 0, 1) 
   ORDER BY `tree`.`lid` ASC

Но он будет равнозначным, если w_org и w_dev подтягиваются только для того чтобы сформировать name.

Цитата(MoLeX @  29.2.2012,  09:25 Найти цитируемый пост)
AND IF(0, `tree`.`level` < 0, 1) 

wtf?

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


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


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

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



Zloxa, спасибо


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


 




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


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

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