首页 > 解决方案 > SQL Join 3 个空值的表

问题描述

我有一个查询返回成员、他们的最后一次访问和最后一次付款。我的问题是它不会在没有访问和/或付款的情况下返回成员。

我以前没有包括最后一次访问,然后我使用 LEFT 和 RIGHT JOIN 而不是 INNER 进行了查询,但是当我添加访问表时,我收到了一些帮助来包含它,但我们没有注意到我们缺少具有空值的成员在参观或付款。

我试过应用 LEFT 和 RIGHT JOIN,但没有任何运气。我也尝试添加例如。“OR (pt.member_id IS NULL)”也没有成功。

SELECT
    mr.member_id, 
    mr.name, 
    mr.tag, 
    pt.semester, 
    pt.date, 
    vt.date, 
FROM 
    members mr
INNER JOIN 
    payment pt 
ON 
    pt.member_id = mr.member_id 
    INNER JOIN 
        ( SELECT 
            member_id, 
            MAX(payment_id) max_value 
        FROM 
            payment 
        GROUP BY    
            member_id ) pt2 
    ON 
        pt.member_id = pt2.member_id 
    AND 
        pt.payment_id = pt2.max_value   
INNER JOIN 
    visit vt 
ON 
    vt.member_id = mr.member_id 
    INNER JOIN  
        ( SELECT    
            member_id, 
            MAX(date) max_visit_value 
        FROM 
            visit 
        GROUP BY 
            member_id ) vt2 
    ON 
        vt.member_id = vt2.member_id 
    AND 
        vt.date = vt2.max_visit_value

我想得到一个访问和/或付款可以为空的结果。

我希望我有道理,有人可以帮助我:)

MySQL 5.6

标签: mysqlsqljoinmysql-5.6

解决方案


以下使用左连接的版本可能会给您想要的结果:

SELECT
    mr.member_id,
    mr.name,
    mr.tag,
    pt.semester,
    pt.date,
    vt.date,
FROM members mr
LEFT JOIN payment pt
    ON pt.member_id = mr.member_id
LEFT JOIN
(
    SELECT member_id, MAX(payment_id) max_value
    FROM payment
    GROUP BY member_id
) pt2
    ON pt.member_id = pt2.member_id AND pt.payment_id = pt2.max_value
LEFT JOIN visit vt
    ON vt.member_id = mr.member_id
LEFT JOIN
(
    SELECT member_id, MAX(date) max_visit_value
    FROM visit
    GROUP BY member_id
) vt2
    ON vt.member_id = vt2.member_id AND vt.date = vt2.max_visit_value;

推荐阅读