Объединить два подзапроса в один в инструкции SELECT?

#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 . Смотрите руководство