簡體   English   中英

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

[英]How to return max or NULL if no values in LEFT JOIN

我有兩個表:

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有點生銹,那么如何實現呢?

從所需內容的描述中,我無法理解查詢中的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;

另一種通用的方法是使用帶有連接的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小提琴演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM