我有两张桌子:
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有点生疏,所以我该如何实现呢?
答案 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)