查询以根据最新日期显示最新值

时间:2021-05-07 05:08:32

标签: php mysql

我正在创建一个学校项目,我需要根据他们的贷款交易来监控成员的可用性。

现在的问题是,当会员已经进行了大量交易时,我现有的查询会根据交易请求的最新日期显示所有我只想要当前状态的交易。

我将提供问题的屏幕截图以进行更多可视化。

这是我目前的查询:

$query = $this->db->query("
  SELECT * FROM `tbl_members` 
  LEFT JOIN tbl_loanrequests 
  on tbl_members.member_id = tbl_loanrequests.member_id
");

这里是有用的信息:

CREATE TABLE `tbl_members` (
  `member_id` int(11) NOT NULL,
  `firstname` varchar(250) NOT NULL,
  `lastname` varchar(250) NOT NULL,
  `middlename` varchar(250) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `tbl_members` (`member_id`, `firstname`, `lastname`, `middlename`) VALUES
(1,  'Maribeth', 'Cunha', ''),
(2,  'Thelma ', 'Rush  ', ''),
(3,  'Latoria ', 'Shinn', ''),
(4,  'Quinton ', 'Everman', ''),
(5, 'Robert', 'Evermen', '');

CREATE TABLE `tbl_loanrequests` (
  `loanreq_id` int(11) NOT NULL,
  `member_id` int(11) NOT NULL,
  `loanreq_status` varchar(50) NOT NULL,
  `date_requested` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `tbl_loanrequests` (`loanreq_id`, `member_id`, `loanreq_status`, `date_requested`) VALUES
(2, 1, 'Paid', '2021-05-06'),
(3, 2, 'For Release', '2021-05-06'),
(4, 3, 'Pending', '2021-05-06'),
(5, 5, 'Ongoing', '2021-05-06'),
(6, 1, 'Cancelled', '2021-05-07');

http://sqlfiddle.com/#!9/7647a4/1

在预览中,member_id #1 应该只显示一种状态,即 Cancelled,因为它获得了最新的 date_requested。在左侧,它显示 Clear 但这是我监控成员是否能够提交贷款的一种方式。 enter image description here

1 个答案:

答案 0 :(得分:1)

我认为您的 loanreq_id 是递增的,因此每个成员的最高值始终包含该成员的最高贷款请求日期。如果没有我可以适应

诀窍是使用 MAX...GROUP BY 为每个成员确定最高的 Loanreq_id:

SELECT member_id, MAX(loanreq_id) AS last_loanreq_id
FROM tbl_loanrequests
GROUP BY member_id

然后您应该加入此查询的结果以仅保留每个成员的最新贷款请求。您的查询变为:

SELECT m.*, l.*
FROM `tbl_members` m
LEFT JOIN
    (
    SELECT member_id, MAX(loanreq_id) AS last_loanreq_id
    FROM tbl_loanrequests
    GROUP BY member_id
    ) lm ON lm.member_id = m.member_id 
LEFT JOIN tbl_loanrequests l on l.loanreq_id = lm.last_loanreq_id