簡體   English   中英

獲取內部連接后最新日期的行

[英]Get the row with latest date after inner join

我有這個查詢:

SELECT 
    achievements.id,
    achievements.name,
    achievements.category,
    userAchievements.createdAt
FROM
    achievements
        INNER JOIN
    userAchievements ON userAchievements.achievementId = achievements.id
        AND userAchievements.userId = 12
WHERE
    achievements.type = 2

此查詢的結果是:

ID 姓名 類別 創建時間
8 第一的 1 2021-02-11
13 第二 2 2021-02-12
14 第三 4 2021-03-01
15 第四 4 2021-03-02

我必須只留下具有 max createdAt 字段的唯一類別。

我需要一個將給出以下結果的查詢:

ID 姓名 類別 創建時間
8 第一的 1 2021-02-11
13 第二 2 2021-02-12
15 第四 4 2021-03-02

如果我使用group by那么它返回 id 為 14 的行。

MySQL 版本 - 5.7.33。

成績表:

ID 姓名 類別
8 第一的 1
13 第二 2
14 第三 4
15 第四 4

用戶成就表:

ID 成就標識 用戶身份 創建時間
3 8 12 2021-02-11
7 13 12 2021-02-12
36 15 12 2021-03-02
40 14 12 2021-03-01

PS我設法編寫了一個解決問題的查詢

SELECT 
    *
FROM
    (SELECT 
        *,
            IF(@prev <> category, @rn:=0, @rn),
            @prev:=category,
            @rn:=@rn + 1 AS rn
    FROM
        (SELECT 
        achievements.id,
            achievements.name,
            achievements.category,
            userAchievements.createdAt
    FROM
        achievements
    INNER JOIN userAchievements ON userAchievements.achievementId = achievements.id
        AND userAchievements.userId = 12
    WHERE
        achievements.type = 2) as ach, (SELECT @rn:=0) rn, (SELECT @prev:='') prev
    ORDER BY ach.createdAt DESC) t
WHERE
    rn = 1

您可以使用 window 函數:

SELECT a.*
FROM (SELECT a.*, 
             ROW_NUMBER() OVER (PARTITION BY a.category ORDER BY a.created_at DESC) as seqnum
      FROM achievements JOIN
           userAchievements ua
           ON ua.achievementId = a.id AND
              ua.userId = 12
      WHERE a.type = 2
     ) a
WHERE seqnum = 1;

這個子查詢基本上搜索所有最大日期,按類別分組。

SELECT MAX(_ua.createdAt) FROM `achievements` _a INNER JOIN user_achievements _ua ON _a.id = _ua.achievementId group by _a.category

所以你也許可以這樣做:

SELECT a.* FROM achievements a
INNER JOIN user_achievements ua ON a.id = ua.achievementId 
AND ua.createdAt IN (SELECT MAX(_ua.createdAt) FROM `achievements` _a INNER JOIN 
user_achievements _ua ON _a.id = _ua.achievementId group by _a.category)

暫無
暫無

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

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