cof*_*tor 8 mysql subquery greatest-n-per-group
我正在尝试显示成员记录列表,我有一些表用于显示我需要的内容.
这很容易.我需要帮助的部分是一个表,每个成员记录有许多记录:登录历史记录
我想只显示每个成员记录的第一行,它存在于"登录历史记录"表中.或者,我可能想要翻转并在Login History表中显示最后一条记录.
这是我到目前为止所得到的:
SELECT m.memberid, m.membername, m.gender, mp.phone
FROM tbl_members m,
tbl_members_phones mp,
tbl_members_addresses ma
WHERE m.defaultphoneid = mp.phoneid
AND m.defaultaddressid = ma.addressid
Run Code Online (Sandbox Code Playgroud)
所以这会回报预期的结果.
tbl_members_login_history我要添加到返回结果的2列是:mh.loggedtime,嗯.ipaddy
我知道添加tbl_members_login_history作为LEFT JOIN将返回重复项,所以我认为这里必须有一个Subquery必需,以便只返回memberid存在于其中的第一条记录tbl_members_login_history.
我担心的是,如果历史表中没有记录,我仍然希望显示该成员信息,但将历史记录列保留为NULL.
这会是一个子查询事件吗?如果是这样,如何添加那种LIMIT?
Bil*_*win 20
这是greatest-n-per-group问题,在Stack Overflow上经常被问到.
以下是我在您的场景中如何解决它:
SELECT m.memberid, m.membername, m.gender, mp.phone, mh.loggedtime, mh.ipaddy
FROM tbl_members m
INNER JOIN tbl_members_phones mp ON m.defaultphoneid = mp.phoneid
INNER JOIN tbl_members_addresses ma ON m.defaultaddressid = ma.addressid
LEFT OUTER JOIN tbl_members_login_history mh ON m.memberid = mh.memberid
LEFT OUTER JOIN tbl_members_login_history mh2 ON m.memberid = mh2.memberid
AND mh.pk < mh2.pk
WHERE mh2.pk IS NULL;
Run Code Online (Sandbox Code Playgroud)
也就是说,我们希望mh成为给定memberid的tbl_member_login_history中的最新行.所以我们搜索更新的另一行mh2.如果没有mh找到比行更新的,那么mh2.*将为NULL,因此mh必须是最新的.
我假设这个表有一个包含增加值的主键列.对于此示例,我假设列名称为pk.
对两个对登录历史记录表的引用使用LEFT OUTER JOIN 意味着m即使没有匹配的行也会报告该行.