仅获取最新的MySQL事务

时间:2019-02-04 18:39:14

标签: mysql greatest-n-per-group

我正在尝试从一个WordPress数据库中导出一组用户信息,以导入到另一个数据库中。但是,我在弄清楚如何只为用户导出最新的会员交易方面遇到麻烦。以下查询导出每个用户的所有事务,但是我只希望事务具有最新的“ t.expires_at”值。我已经尝试过基于其他StackOverflow线程的各种子查询,但是还不太清楚。

SELECT DISTINCT
    u.user_login AS user_login, 
    u.user_email AS user_email, 
    u.user_registered AS user_registered, 
    f.meta_value AS first_name, 
    l.meta_value AS last_name,
    t.expires_at AS membership_enddate
FROM 
    wp_acfzia_users AS u
LEFT JOIN 
    wp_acfzia_usermeta AS f
    ON u.ID = f.user_id AND f.meta_key = 'first_name'
LEFT JOIN 
    wp_acfzia_usermeta AS l
    ON u.ID = l.user_id AND l.meta_key = 'last_name'
LEFT JOIN
    wp_acfzia_mepr_transactions AS t
    ON u.ID = t.user_id

1 个答案:

答案 0 :(得分:1)

尝试这种方法

SELECT DISTINCT
    u.user_login AS user_login, 
    u.user_email AS user_email, 
    u.user_registered AS user_registered, 
    f.meta_value AS first_name, 
    l.meta_value AS last_name,
    t.expires_at AS membership_enddate
FROM 
    wp_acfzia_users AS u
LEFT JOIN 
    wp_acfzia_usermeta AS f
    ON u.ID = f.user_id AND f.meta_key = 'first_name'
LEFT JOIN 
    wp_acfzia_usermeta AS l
    ON u.ID = l.user_id AND l.meta_key = 'last_name'
LEFT JOIN
    wp_acfzia_mepr_transactions AS t
    ON u.ID = t.user_id
WHERE exists (
   select 1 from tbl where tbl.user_id = t.user_id 
   having max(tbl.expires_at) = t.expires_at
)

或MySQL 8 +

select * from (
    SELECT DISTINCT
        u.user_login AS user_login, 
        u.user_email AS user_email, 
        u.user_registered AS user_registered, 
        f.meta_value AS first_name, 
        l.meta_value AS last_name,
        t.expires_at AS membership_enddate,
        row_number() over (order by t.expires_at partition by user_id) rn
    FROM 
        wp_acfzia_users AS u
    LEFT JOIN 
        wp_acfzia_usermeta AS f
        ON u.ID = f.user_id AND f.meta_key = 'first_name'
    LEFT JOIN 
        wp_acfzia_usermeta AS l
        ON u.ID = l.user_id AND l.meta_key = 'last_name'
    LEFT JOIN
        wp_acfzia_mepr_transactions AS t
        ON u.ID = t.user_id
)
Where rn = 1