2015-06-20 32 views
1

我設法獲取數據並通過使用左外連接包含NULL值。這是我當前的查詢:LEFT OUTER JOIN獲取max()幷包含NULL值

select s.user, a.id, a.datetime as date, a.total_time 
from steam_accounts s 
left outer join activity a on a.steam_id = s.id 
where s.user_id = 1 

這將返回此:

enter image description here

這幾乎是完美的。但是現在我需要使用max(a.id)篩選結果,並且如果沒有來自外部聯接的匹配項,那麼將包含空值。

這是我已經試過:

select s.id, s.user, max(a.id), a.datetime as date, a.total_time 
from steam_accounts s 
left outer join activity a on a.steam_id = s.id 
where s.user_id = "1" 

結果:

enter image description here

所有空值消失。我只想過濾前一個查詢的前兩個結果。

這是我想要的結果:

enter image description here

任何多少是大加讚賞。由於

回答

1

唉,MySQL沒有OUTER APPLYLATERAL JOIN,所以這將是效率較低,比它本來可以。看來,這樣的事情應該產生你想要什麼:

SELECT 
    s.id 
    ,s.user 
    ,ActivityIDs.MaxActivityID 
    ,activity.datetime as date 
    ,activity.total_time 
FROM 
    steam_accounts s 
    LEFT JOIN 
    (
     SELECT 
      a.steam_id 
      ,max(a.id) AS MaxActivityID 
     FROM activity a 
     GROUP BY a.steam_id 
    ) AS ActivityIDs 
    ON ActivityIDs.steam_id = s.id 
    LEFT JOIN activity ON 
     activity.id = ActivityIDs.MaxActivityID 
WHERE 
    s.user_id = 1 

對於每個steam_account我們發現一個activity,最大ID在第一LEFT JOIN。然後,我們獲取的第二LEFT JOIN使用找到ID activity細節休息。

+0

@GordonLinoff,在這種情況下,他們是「左連接」,他們應該是「左」,而不是「內」。 where子句只過濾'steam_accounts',而不是'activity'表。你一定誤解了這個問題。 –

+0

我一定誤會了答案。 –

0

使用max(coalesce(a.id, 0))

與空結果做總是會返回null

+0

我收到這個查詢的單一結果。感謝您的回覆 –

0

我能想到的會使用ROW_NUMBER()使用分區功能在SQL Server或PostgreSQL的任何聚集。有一個示例如何在MySQL中執行此操作:

http://blog.sqlauthority.com/2014/03/09/mysql-reset-row-number-for-each-group-partition-by-row-number/

下一步怎麼走,我想你的分區結果由用戶設置,並通過date降序排序,然後取其中ROW_NUMBER是等於1

我在這裏給出類似的答案使用SQL Server功能記錄: https://stackoverflow.com/a/30952154/3680098

應該產生你的結果設置如下:

Result set

0

使用匯總計算最大值。使用其他left join該記錄然後加入:

select s.user, a.id, a.datetime as date, a.total_time 
from steam_accounts s left outer join 
    activity a 
    on a.steam_id = s.id left outer join 
    (select a.steam_id, max(a.id) as maxid 
     from activity a 
     group by a.steam_id 
    ) amax 
    on amax.steam_id = a.steam_id and amax.maxid = a.id 
where s.user_id = 1; 
+0

我沒有收到您的查詢結果。感謝您花時間回覆 –

+1

這不會產生與問題中原始查詢相同的行數嗎?我認爲這裏的命令或「左連接」很重要。第一個'join'返回'activity'中的所有行,第二個'join'不能刪除那些不需要的行。我的答案基本上是一樣的,但'加入'是在不同的順序 –

+0

@VladimirBaranov。 。 。如果沒有樣本數據,要分辨聯接的順序應該是多少有點難。你似乎已經得到了正確的答案。 –