Существует два варианта использования соединения OUTER, и результаты могут быть очень разными, поэтому детали имеют значение.
SELECT at.Tag,
t.url, t.votes
FROM adminTags at
LEFT JOIN tags t ON t.tag = at.tag
AND t.url = $site
Этот запрос будет применять t.url = $site
до объединениявыполняется , что дает вам предварительно отфильтрованные результаты.
SELECT at.Tag,
t.url, t.votes
FROM adminTags at
LEFT JOIN tags t ON t.tag = at.tag
WHERE t.url = $site
Приведенный выше запрос применяет критерии после объединения .Он не «конвертирует ВНЕШНЕЕ СОЕДИНЕНИЕ в ВНУТРЕННЕЕ СОЕДИНЕНИЕ» - он фильтрует набор результатов после выполнения OUTER JOIN
.
В этом примере между наборами результатов нет никакой разницы.Однако, если в столбце URL указано, что он не имеет значения NULL (значение не может быть NULL), вы можете проверить наличие NULL (что скажет, что у ADMINTAGS
нет соответствующих TAGS
записей:
SELECT at.Tag,
t.url, t.votes
FROM adminTags at
LEFT JOIN tags t ON t.tag = at.tag
WHERE t.url IS NULL
... тогда как следующий будет возвращать NULL
для всех ссылок на TAGS
(при этом не будет точно отображаться ADMINTAGS
строк без связанных TAGS
строк:
SELECT at.Tag,
t.url, t.votes
FROM adminTags at
LEFT JOIN tags t ON t.tag = at.tag
AND t.url IS NULL