Задавайте вопросы, мы ответим
Вы не зашли.
Есть запрос вида:
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)))
Но при таком способе данные выводятся не правильно. Т.е. в результат не включаются данные, для которых строки какой-либо из таблиц не заданы. Помогите пожалуйста правильно переделать первый запрос. Или в этом нет необходимости?
Неактивен
Если все работает, то зачем переживать?
Неактивен
Заставило переживать только вот это предложение в документации:
Никогда не следует указывать в части ON какие бы то ни было условия, накладывающие ограничения на строки в наборе результатов. Если необходимо указать, какие строки должны присутствовать в результате, следует сделать это в выражении WHERE.
Неактивен
Ну, лично мне гораздо понятнее, когда в ON написаны только условия связи таблиц, а
ограничения написаны в WHERE. С моей точки зрения это просто логичнее и удобнее читать.
Есть однако люди, у которых логика перпендикулярная (я их совсем не понимаю, но они
есть), они считают, что им удобнее понимать в ON.
До тех пор, пока MySQL не ругается нехорошими словами и отдает нужные результаты —
можете пользоваться
Неактивен