mysql - 当一张表没有行时 JOIN

标签 mysql sql

我有以下查询:

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)。

最佳答案

由于 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;

也就是说,如果您只想从 prospect_notes 获取 time_created,则使用更简单的查询:

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);

关于mysql - 当一张表没有行时 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59546609/

相关文章:

MySQL FULLTEXT 仅返回最佳答案

php - 显示 DB 的价格

sql - 哈希速度更快,冲突更少?

mysql - GROUP BY id 在 ORDER BY time 之后

MySQL 自定义排序

php - 在 MySQL 中查询时连接表

mysql - 选择带有搜索标记的所有帖子(以及关联的标签)

php - 如何在特定时间之前自动将邮件发送给各个用户?

php - 在php中解析Json时插入错误?

Android:将多条记录插入/更新到 SQL 数据库