SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 28.07.2009 18:14:03

djalex777
Участник
Зарегистрирован: 28.07.2009
Сообщений: 5

Правильность запроса

Есть запрос вида:

select s.*, slr.*, slc.*, slriy.*, slrig.*
                                     from sape_link as s
                                       left join sape_link_real as slr on slr.insape_id = s.insape_id and
                                         slr.stat_add_datetime = (select max(slr3.stat_add_datetime) from sape_link_real as slr3 where
                                         slr3.insape_id = s.insape_id)
                                       left join sape_link_content as slc on slc.insape_id = s.insape_id and
                                         slc.stat_add_datetime = (select max(slc3.stat_add_datetime) from sape_link_content as slc3 where
                                         slc3.insape_id = s.insape_id)
                                       left join sape_link_real_inindex_yandex as slriy on slriy.insape_id = s.insape_id and
                                         slriy.stat_add_datetime = (select max(slriy3.stat_add_datetime) from sape_link_real_inindex_yandex as slriy3 where
                                         slriy3.insape_id = s.insape_id)
                                       left join sape_link_real_inindex_google as slrig on slrig.insape_id = s.insape_id and
                                         slrig.stat_add_datetime = (select max(slrig3.stat_add_datetime) from sape_link_real_inindex_google as slrig3 where
                                         slrig3.insape_id = s.insape_id)                                         
                                     where
                                     (s.unique_group_id = (select IFNULL(MAX(ss.unique_group_id),0) from sape_link as ss
                                      inner join sape_phrase as sp on ss.sape_phrase_id = sp.id
                                      where sp.insape_id = (select sp3.insape_id from sape_phrase as sp3 where sp3.id = 15000)))

Всё прекрасно работает, но тут вычитал в документации MYSQL, что при использовании JOIN запрещено накладывать какое-либо условие, ограничивающее набор данных в операторе ON. А условие нужно писать в WHERE. Попробовал переписать так:

select s.*, slr.*, slc.*, slriy.*, slrig.*
                                     from sape_link as s
                                       left join sape_link_real as slr on slr.insape_id = s.insape_id
                                       left join sape_link_content as slc on slc.insape_id = s.insape_id
                                       left join sape_link_real_inindex_yandex as slriy on slriy.insape_id = s.insape_id
                                       left join sape_link_real_inindex_google as slrig on slrig.insape_id = s.insape_id                                         
                                     where
                                       (slr.stat_add_datetime = (select max(slr3.stat_add_datetime) from sape_link_real as slr3 where
                                         slr3.insape_id = s.insape_id) and
                                       slc.stat_add_datetime = (select max(slc3.stat_add_datetime) from sape_link_content as slc3 where
                                         slc3.insape_id = s.insape_id) and                                 
                                       slriy.stat_add_datetime = (select max(slriy3.stat_add_datetime) from sape_link_real_inindex_yandex as slriy3 where
                                         slriy3.insape_id = s.insape_id) and
                                       slrig.stat_add_datetime = (select max(slrig3.stat_add_datetime) from sape_link_real_inindex_google as slrig3 where
                                         slrig3.insape_id = s.insape_id)) and
                                       (s.unique_group_id = (select IFNULL(MAX(ss.unique_group_id),0) from sape_link as ss
                                       inner join sape_phrase as sp on ss.sape_phrase_id = sp.id
                                       where sp.insape_id = (select sp3.insape_id from sape_phrase as sp3 where sp3.id = 15000)))

Но при таком способе данные выводятся не правильно. Т.е. в результат не включаются данные, для которых строки какой-либо из таблиц не заданы. Помогите пожалуйста правильно переделать первый запрос. Или в этом нет необходимости?

Неактивен

 

#2 28.07.2009 18:23:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Правильность запроса

Если все работает, то зачем переживать? smile

Неактивен

 

#3 28.07.2009 19:07:09

djalex777
Участник
Зарегистрирован: 28.07.2009
Сообщений: 5

Re: Правильность запроса

Заставило переживать только вот это предложение в документации:
Никогда не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов. Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE.
smile

Неактивен

 

#4 28.07.2009 20:56:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Правильность запроса

Ну, лично мне гораздо понятнее, когда в ON написаны только условия связи таблиц, а
ограничения написаны в WHERE. С моей точки зрения это просто логичнее и удобнее читать.

Есть однако люди, у которых логика перпендикулярная (я их совсем не понимаю, но они
есть), они считают, что им удобнее понимать в ON.

До тех пор, пока MySQL не ругается нехорошими словами и отдает нужные результаты —
можете пользоваться smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson