Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.08.04;
Скачать: CL | DM;

Вниз

"Непривязанный" join   Найти похожие ветки 

 
Дмитрий С ©   (2010-12-06 17:47) [0]

К примеру надо найти автомобили с тем же брендом и двигателем, что и у автомобиля с id 33, как вам такой запрос:


SELECT `a`.*
FROM `auto` `a`
LEFT JOIN `auto` `sub_a` ON `sub_a`.`id` = 33
WHERE
`a`.`brand` = `sub_a`.`brand`
AND `a`.`engine` = `sub_a`.`engine`

Спорная строчка выделена жирным.
Или лучше все-таки выполнить запрос, а потом подставлять уже текст?


 
Дмитрий С ©   (2010-12-06 17:52) [1]

Хотя EXPLAIN, похоже говорит, что можно и так делать.

1 SIMPLE sub_a const PRIMARY,IX_auto_brand,IX_auto_engine_model,IX_body_model,IX_model PRIMARY 4 const 1
1 SIMPLE a ref IX_auto_brand,IX_auto_engine_model,IX_body_model,IX_model IX_auto_brand 767 const 7 Using where



Похоже вопрос можно снять


 
Ega23 ©   (2010-12-06 17:57) [2]

По-идее это в where должно стоять. А оптимизатор - сам разобраться, что к чему.

З.Ы. Интересная трактовка. Надо обдумать.


 
Кщд   (2010-12-06 18:51) [3]

>Дмитрий С ©   (06.12.10 17:47)  
чем не подходит in?
зачем тут соединение, да ещё внешнее?
чтобы случайно на индекс не встать?)


 
Дмитрий С ©   (2010-12-06 18:58) [4]


> Кщд   (06.12.10 18:51) [3]

IN не подходит, т.к. сравнение идет по более, чем одному полю.


 
Дмитрий С ©   (2010-12-06 19:01) [5]


> З.Ы. Интересная трактовка. Надо обдумать.

Надеюсь услышать результат :)


 
sniknik ©   (2010-12-06 19:15) [6]

я бы сделал так, если MySQL конечно позволил бы
SELECT * FROM auto a
INNER JOIN (SELECT brand, engine FROM auto WHERE id = 33) b
ON a.brand = b.brand AND a.engine = b.engine


 
Кщд   (2010-12-06 19:39) [7]

>Дмитрий С ©   (06.12.10 18:58) [4]
row/table subqueries поддерживаются MySQL


 
Кщд   (2010-12-06 19:45) [8]

>sniknik ©   (06.12.10 19:15) [6]
согласно стандартной логике присоединяем к маленькой таблице большую:

SELECT b.*
FROM auto a
          INNER JOIN auto b
            ON a.brand = b.brand
                 AND a.engine = b.engine
where a.id = 33

оптимизатор должен преобразовать запрос именно в такой
но у автора зачем-то внешнее соединение, что не отвечает его же поставленным условиям
видимо, ему надо-таки выводить бренд и двигатель, а не просто находить совпадения


 
Дмитрий С ©   (2010-12-07 06:04) [9]


> sniknik ©   (06.12.10 19:15) [6]

Поддерживает, конечно, хороший вариант, спасибо.
PS. стыдно признаться, но я не знаю разницы между inner и left


> оптимизатор должен преобразовать запрос именно в такой

Какая же это оптимизация будет?


 
Кщд   (2010-12-07 07:18) [10]

>Дмитрий С ©   (07.12.10 06:04) [9]
запрос из (Кщд   (06.12.10 19:45) [8]) демонстрирует логику оптимизатора:
1. выбрать одну запись из таблицы(желательно, если есть PK);
2. затем присоединить к этой таблице другую.
т.е. в общем случае к "меньшей" таблице присоединяется "бОльшая" - не наоборот

разница между внешним и внутренним соединением критична - в случае с внешним объединением оптимизатор может не задействовать индекс(в Вашем случае по brand, engine), отдав предпочтение full table scan, что логично

>Какая же это оптимизация будет?
http://forge.mysql.com/wiki/How_does_the_MySQL_Optimizer_work

лучше начать с основ - типы соединений таблиц, методы доступа, индексирование, селективность и пр.


 
Дмитрий С ©   (2010-12-07 07:21) [11]


> Кщд   (07.12.10 07:18) [10]

Я понял логику, сразу не сообразил, спасибо.


 
Anatoly Podgoretsky ©   (2010-12-07 08:57) [12]

> Дмитрий С  (07.12.2010 06:04:09)  [9]

Обычно это описано в документации, не говоря уже об Интернет.


 
Дмитрий С ©   (2010-12-07 09:26) [13]


> Anatoly Podgoretsky ©   (07.12.10 08:57) [12]

Да это понятно. Читал и не раз, просто почти никогда кроме LEFT JOIN ничего не использовал, поэтому забываю.



Страницы: 1 вся ветка

Текущий архив: 2013.08.04;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
15-1362573744
Jeer
2013-03-06 16:42
2013.08.04
А между тем в PascalABC.Net появился..


15-1358540712
HDD-Life
2013-01-19 00:25
2013.08.04
SSD плюсы и минусы


2-1354631783
брат Птибурдукова
2012-12-04 18:36
2013.08.04
duplicate resources


2-1354629104
greenbear
2012-12-04 17:51
2013.08.04
Помогите открыть файл


2-1354473709
FIL-23
2012-12-02 22:41
2013.08.04
правильное объявление процедур