Присоединиться, когда в одной таблице нет строк - PullRequest
0 голосов
/ 12 июня 2019

У меня следующий запрос:

SELECT u.id, u.name, u.date_registered, p.time_created 
    FROM users u JOIN 
        prospect_notes p 
        ON u.id=p.subject_id  
    WHERE u.allocated_instructors = 668
    AND p.time_created = (SELECT MAX(p2.time_created) FROM prospect_notes p2 WHERE p2.subject_id = p.subject_id)
    ORDER BY p.time_created;

Моя проблема заключается в том, что, когда в таблице prospect_notes нет строк, которые соответствуют следующему:

AND p.time_created = (SELECT MAX(p2.time_created) FROM prospect_notes p2 WHERE p2.subject_id = p.subject_id)

Я не получил результата.

Вместо этого я хочу, чтобы все строки в таблице users возвращались (предположительно, p.time_created в таких случаях будет равно NULL).

Ответы [ 2 ]

3 голосов
/ 12 июня 2019

Вы должны быть осторожны из-за предложения JOIN.Предположительно, если нет совпадений для коррелированного подзапроса, в JOIN также нет совпадений.

Итак, используйте LEFT JOIN и переместите логику в предложение FROM:

SELECT u.id, u.name, u.date_registered, p.time_created 
FROM users u LEFT JOIN 
     prospect_notes p 
     ON u.id = p.subject_id LEFT JOIN
     (SELECT p2.subject_id, MAX(p2.time_created) as max_time_created
      FROM prospect_notes p2
      GROUP BY p2.subject_id
     ) p2
     ON p2.subject_id = p.subject_id AND p2.time_created = p.time_created
WHERE u.allocated_instructors = 668 
ORDER BY p.time_created;

Тем не менее, если вы хотите только time_created из prospect_notes, используйте более простой запрос:

SELECT u.id, u.name, u.date_registered, MAX(p.time_created)
FROM users u LEFT JOIN 
     prospect_notes p 
     ON u.id = p.subject_id 
WHERE u.allocated_instructors = 668 
GROUP BY u.id  -- okay, assuming id is unique or a primary key
ORDER BY MAX(p.time_created);
1 голос
/ 12 июня 2019

Вам нужно LEFT JOIN, это предложение позволяет вам иметь NULL значения в правой таблице.

Попробуйте:

SELECT u.id, u.name, u.date_registered, p.time_created 
FROM users u 
LEFT JOIN prospect_notes p 
    ON u.id=p.subject_id  
WHERE u.allocated_instructors = 668
AND p.time_created = (SELECT MAX(p2.time_created) FROM prospect_notes p2 WHERE p2.subject_id = p.subject_id)
ORDER BY p.time_created;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...