Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / left join или вложенный select / 12 сообщений из 12, страница 1 из 1
07.12.2015, 09:26:13
    #39121919
caHek2x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
Есть таблица с документами
грубо говоря:
автор"doc"
-id
-name
и есть таблица с правами доступа к документа
грубо говоря:
автор"doc_groups"
-id
-iddoc
-idgroup

у документа соответственно может быть несколько групп ...
надо например выдернуть документы у которых есть доступ для 10 группы и 11...
как правильней ?
у меня два варианта.. как я делал ....
раньше я делал:
Код: sql
1.
2.
3.
4.
5.
SELECE d.id, d.name
FROM doc d
LEFT JOIN doc_groups dg ON dg.iddoc = d.id
WHERE dg.idgroup in (10, 11)
GROUP BY d.id



Сейчас начал делать:
Код: sql
1.
2.
3.
SELECE d.id, d.name
FROM doc d
WHERE (SELECT count(*) c FROM doc_groups dg WHERE dg.iddoc = d.id AND dg.idgroup in (10, 11)) > 0



Как правильнее ... быстрее ... ? может еще какие варианты есть ... ?
...
Рейтинг: 0 / 0
07.12.2015, 09:59:37
    #39121947
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
...
Рейтинг: 0 / 0
07.12.2015, 10:05:38
    #39121955
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
caHek2xнадо например выдернуть документы у которых есть доступ для 10 группы и 11...
как правильней ?
Оба варианта неправильные.
...
Рейтинг: 0 / 0
07.12.2015, 10:09:34
    #39121959
caHek2x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
AkinacaHek2xнадо например выдернуть документы у которых есть доступ для 10 группы и 11...
как правильней ?
Оба варианта неправильные.
вам не сложно будет написать как будет правильно ?
...
Рейтинг: 0 / 0
07.12.2015, 10:10:11
    #39121960
caHek2x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
использовать EXISTS ?
...
Рейтинг: 0 / 0
07.12.2015, 10:11:50
    #39121962
caHek2x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
caHek2xAkinaпропущено...

Оба варианта неправильные.
вам не сложно будет написать как будет правильно ?
стоп ... не для 10 И 11 .. а для 10 ИЛИ 11 ...
...
Рейтинг: 0 / 0
07.12.2015, 10:17:49
    #39121973
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
Ну вот... тогда запросы правильные.

Я бы делал так:
Код: sql
1.
2.
3.
SELECT DISTINCT d.id, d.name
FROM doc d
LEFT JOIN doc_groups dg ON dg.iddoc = d.id AND dg.idgroup in (10, 11);
...
Рейтинг: 0 / 0
07.12.2015, 10:18:26
    #39121974
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
Стоп. Не LEFT, а INNER JOIN.
...
Рейтинг: 0 / 0
07.12.2015, 10:23:00
    #39121983
caHek2x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
AkinaСтоп. Не LEFT, а INNER JOIN.
inner от left отличается тем что left берет все записи даже есть нет совпадений в подсоединяемой таблице .. ?
то что правильные в смысле правильных результатов это да ... а как правильней ?
...
Рейтинг: 0 / 0
07.12.2015, 10:33:27
    #39122000
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
caHek2xкак правильней ?
Правильно - когда текст запроса соответствует требуемой логике. Внутреннее и левое связывания не могут соответствовать ей ОДНОВРЕМЕННО. Поскольку условие требует ОБЯЗАТЕЛЬНОГО наличия хотя бы одной записи либо 10, либо 11 группы, соответствующей выбираемой, чему стороннее связывание НЕ соответствует - нужно использовать строго внутреннее.
...
Рейтинг: 0 / 0
07.12.2015, 10:36:18
    #39122003
caHek2x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
AkinacaHek2xкак правильней ?
Правильно - когда текст запроса соответствует требуемой логике. Внутреннее и левое связывания не могут соответствовать ей ОДНОВРЕМЕННО. Поскольку условие требует ОБЯЗАТЕЛЬНОГО наличия хотя бы одной записи либо 10, либо 11 группы, соответствующей выбираемой, чему стороннее связывание НЕ соответствует - нужно использовать строго внутреннее.
я имел ввиду не с join как правильней ... я имею ввиду как правильней через join или через сложенный select ... и если через селект .. то есть ли смысл использовать EXISTS ?
...
Рейтинг: 0 / 0
07.12.2015, 11:14:17
    #39122050
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
left join или вложенный select
Правильно - это когда результат соответствует требуемому. Так что и так, и эдак правильно (если не напортачить).
Что же до оптимальности - то, полагаю, запрос
Код: sql
1.
2.
3.
SELECT DISTINCT d.id, d.name
FROM doc d
INNER JOIN doc_groups dg ON dg.iddoc = d.id AND dg.idgroup in (10, 11);


является оптимальным. Особенно при наличии необходимых для его эффективного выполнения индексов.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / left join или вложенный select / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]