如果LEFT JOIN中没有值,如何返回max或NULL

时间:2015-05-22 13:10:58

标签: mysql sql

我有两张桌子:

page
p_key   name
1       home
2       projects
3       contacts

article
p_key   page_id     seq (+ other article content fields)
1         1           1
2         1           2
3         1           3
4         2           1
5         2           2

article.seq指定文章在页面上的显示顺序。

我需要一个查询,它将返回包含page.p_key的单个记录和该页面上文章的当前最大article.seq,如果该页面没有文章,则返回NULL。

目前我有:

SELECT p.p_key, a.seq FROM page p 
LEFT JOIN article a ON p.p_key = a.page_Id 
WHERE a.seq = 
    (SELECT MAX(seq) FROM article a2 
     WHERE a2.page_id = 1);

这适用于p.p_key的这个值,返回[1,3]

但是,如果页面没有文章(例如,如果我将'WHERE a2.page_id = 1'更改为'WHERE a2.page_id = 3'),则查询不返回任何记录。我需要的是它返回[3,NULL](我正在寻找LEFT JOIN)。

我承认我的SQL有点生疏,所以我该如何实现呢?

2 个答案:

答案 0 :(得分:0)

根据您的描述,我不了解您的查询中的a2.page_id = 1。以下内容应该返回您要求的内容:

SELECT p.p_key,
       (SELECT MAX(a.seq)
        FROM article a
        WHERE p.p_key = a.page_Id
       ) as seq
FROM page p ;

为了提高性能,我建议在article(page_Id, seq)上建一个索引。

编辑:

对于特定页面,您可以在外部查询中添加WHERE子句:

SELECT p.p_key,
       (SELECT MAX(a.seq)
        FROM article a
        WHERE p.p_key = a.page_Id
       ) as seq
FROM page p
WHERE p.p_key = $page;

答案 1 :(得分:0)

执行此操作的另一种常规方法是使用连接GROUP BY,并且大多数聚合函数将返回空源数据的空结果:

SELECT Page.p_key, MAX(Article.seq)
FROM Page
LEFT JOIN Article
       ON Article.page_id = Page.p_key
-- WHERE Page.p_key = 1
GROUP BY Page.p_key

返回预期结果:

p_key    MAX(Article.seq)    
1        3 
2        2 
3        (null) 

SQL Fiddle Demo