#mysql #select #subquery
#mysql #выберите #подзапрос
Вопрос:
Есть ли лучший способ сделать этот оператор SELECT с этими двумя подзапросами?
SELECT N.ID, N.NAME
(SELECT TR.PUZZLE
FROM puzzles TR
WHERE TR.TEAMID = "152"
AND TR.NID= N.ID) AS PUZZLE_OK,
(SELECT TR.PUZZLE_BIS
FROM puzzles TR
WHERE TR.TEAMID = "152"
AND TR.NID= N.ID) AS PUZZLE_BIS_OK
FROM news N
WHERE N.SERIESID = "1"
Ответ №1:
Вы можете переписать свой запрос, используя JOIN
вместо:
SELECT N.ID, N.NAME, TR.PUZZLE AS PUZZLE_OK, TR.PUZZLE_BIS AS PUZZLE_BIS_OK
FROM news N
JOIN puzzles TR ON TR.NID = N.ID
WHERE N.SERIESID = "1"
AND TR.TEAMID = "152"
Обратите внимание, что если возможно puzzles
, что для заданного ID
значения from не существует записи in news
, вы должны использовать a LEFT JOIN
и переместить WHERE
условие puzzles
в JOIN
. Затем это вернет NULL
значения для PUZZLE_OK
и PUZZLE_BIS_OK
таким же образом, как и ваши подзапросы:
SELECT N.ID, N.NAME, TR.PUZZLE AS PUZZLE_OK, TR.PUZZLE_BIS AS PUZZLE_BIS_OK
FROM news N
LEFT JOIN puzzles TR ON TR.NID = N.ID AND TR.TEAMID = "152"
WHERE N.SERIESID = "1"
Обратите внимание, что я изменил псевдоним на news
N
, чтобы сохранить SELECT
предложение в соответствии с тем, что было в подзапросах в вашем вопросе.
Комментарии:
1. Спасибо. Я не знаю, почему я не подумал о JOIN.
2. Я уже пробовал использовать LEFT JOIN, чтобы добавить свой ответ. Я не знаю, что мы могли бы добавить что-то еще после ЛЕВОГО СОЕДИНЕНИЯ… ВКЛ … с помощью И
3. @Padd При использовании a
LEFT JOIN
на самом деле необходимо включать такие условия, какTR.TEAMID = "152"
в условие соединения, иначеLEFT JOIN
становитсяINNER JOIN
. Смотрите руководство