gpt4 book ai didi

MySQL 子查询 - 仅查找 LEFT JOIN 中的第一条记录

转载 作者:可可西里 更新时间:2023-11-01 06:31:35 27 4
gpt4 key购买 nike

我正在尝试显示成员记录列表,并且我有几个表格用于显示我需要的内容。

这是简单的部分。我需要帮助的部分是一个表,每个成员记录都有很多记录:登录历史

我只想显示登录历史表中每个成员记录的第一行。或者,我可能还想触发并显示登录历史表中的最后一条记录。

这是我到目前为止所得到的:

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

所以这会返回预期的结果。

我想添加到返回结果中的 tbl_members_login_history 的 2 列是:mh.loggedtime、mh.ipaddy

我知道添加 tbl_members_login_history 作为 LEFT JOIN 会返回重复项,所以我认为这里必须有一个子查询必要性,以便仅返回该 memberid 的第一条记录 存在于 tbl_members_login_history 中。

我担心的是,如果历史表中没有记录,我仍然想显示该成员(member)信息,但将历史列保留为 NULL。

这会是子查询事件吗?如果是这样,如何添加这种类型的 LIMIT?

最佳答案

这是 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;

也就是说,我们希望 mh 成为给定 memberid 的 tbl_member_login_history 中的最新行。因此,我们搜索另一行 mh2,它甚至更近。如果没有找到比 mh 行更新的行,则 mh2.* 将为 NULL,因此 mh 必须是最新的。

我假设此表有一个包含递增值的主键列。对于此示例,我假设列名称是 pk

对登录历史表的both 引用使用 LEFT OUTER JOIN 意味着即使没有匹配的行也会报告 m 行。

关于MySQL 子查询 - 仅查找 LEFT JOIN 中的第一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8977782/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com