【问题标题】:How to display the last record from the group by and display the remaining records?如何显示 group by 中的最后一条记录并显示剩余记录?
【发布时间】:2019-02-24 12:48:04
【问题描述】:

我检查了 SO,但我没有找到解决方案。

我正在使用 CodeIgniter。

我有一个具有相同 member_id 的表。我正在做的是我必须显示所有 member_id 但如果 member_id 相同,则显示该成员 id 的最后一条记录。我尝试了以下查询,但仍然无法为我工作。

如何获得添加最后一条记录的分组依据?

这是桌子

使用查询后,我得到了这个输出

现在请注意,member_id 337 和 343 在表中出现了两次,我正在获取最后一条记录。

请检查此查询

SELECT  MAX(member_id),membershipForTheYear,membership_added_date 
FROM membership_details GROUP BY member_id 
ORDER BY membership_added_date DESC 

我正在使用 phpmyadmin。我导出文件打开它并在此处添加代码。

CREATE TABLE `membership_details` (
  `membership_id` int(11) NOT NULL,
  `member_id` int(11) NOT NULL,
  `membership_added_date` varchar(100) NOT NULL,
  `membershipForTheYear` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `membership_details` (`membership_id`, `member_id`, `membership_added_date`, `membershipForTheYear`) VALUES
(1, 209, '23-02-2019 02:40:22', '2018-2019'),
(2, 337, '22-02-2019 02:47:10', '2018-2019'),
(3, 2, '23-02-2019 06:36:40', '2019-2020'),
(4, 337, '23-02-2019 21:15:08', '2019-2020'),
(5, 343, '24-02-2019 15:07:05', '2018-2019'),
(6, 343, '24-02-2019 15:09:20', '2019-2020');

我试过查询

SELECT * 
FROM membership_details WHERE (membership_id,member_id) IN 
( SELECT membership_id, MAX(membership_id)
  FROM membership_details
  GROUP BY member_id
)

CodeIgniter

/*sub query*/
    $this->db->select('member_id, membershipForTheYear, membership_added_date, max(membership_id) as membership_id')->from('membership_details')->group_by('member_id');
    $subQuery =  $this->db->get_compiled_select();
    /*end sub query*/

    $get_s_member = array('members.member_type' =>2,'members.is_Approved'=>1,'members.is_status'=>1,'relation_member.primary_customer_id' =>$gotPrimaryCustid);
        $this->db->select('*');
        $this->db->from('members'); 
        $this->db->join('('.$subQuery.') as membership_details', 'members.member_id = membership_details.member_id','LEFT');
            $this->db->where($get_s_member);

            $query = $this->db->get();
            $result   = $query->result();
           // print_r($result);

            echo $this->db->last_query();
         if($result)
        {
             return $result;  
        }
        else 
        {
           return 0;  
        }

【问题讨论】:

  • @zeitnot,我的查询是怎么做到的?我尝试了 command + k 并显示在一行中。
  • 您可以点击edit 看看那里发生了什么。它不是黑匣子:)
  • @zeitnot,有背景,你是怎么做到的?
  • 秘密是markdown语法。
  • @zeitnot,感谢您提供的信息。

标签: php mysql codeigniter-3


【解决方案1】:
  • 好的,每个组的最后一行将始终具有最大 ID。
  • 因此,下面的第一个子查询选择 member_id 最大值(也就是最后一个)membership_id
  • 现在,我们基于membership_id 将当前表与上述查询派生表进行内连接并显示详细信息。

SQL:

select m1.membership_id,m1.member_id,m1.membership_added_date,m1.membershipForTheYear
from membership_details m1
inner join (select member_id,max(membership_id) as membership_id
from membership_details 
group by member_id) m2
on m1.membership_id = m2.membership_id;

【讨论】:

  • 给我一些时间来检查您的查询。
  • 如何使用我的 CodeIgniter 代码转换您的代码?我更新了问题中的代码
  • @user9437856 不是 codeIgniter 开发人员。你可以看看this documentation,直接执行查询。
【解决方案2】:

如果membership_idAUTO_INCREMENT PRIMARY KEY,并且选择其中值最高的行就可以了,那么你可以使用:

SELECT *
FROM membership_details
NATURAL JOIN (
    SELECT MAX(membership_id) as membership_id
    FROM membership_details
    GROUP BY member_id
) sub

你也可以只修复你已经尝试过的,即:

SELECT * 
FROM membership_details WHERE (membership_id,member_id) IN 
( SELECT membership_id, MAX(membership_id)
  FROM membership_details
  GROUP BY member_id
)

改成:

SELECT * 
FROM membership_details WHERE (membership_id,member_id) IN 
( SELECT MAX(membership_id), member_id
  FROM membership_details
  GROUP BY member_id
)

但如果membership_id 是PRIMARY KEY,则不需要在WHERE 子句中使用member_id,以下也应该有效:

SELECT * 
FROM membership_details WHERE (membership_id) IN 
( SELECT MAX(membership_id)
  FROM membership_details
  GROUP BY member_id
)

如您所见,子查询与我的 JOIN 查询中的相同。

【讨论】:

  • 我尝试的查询对未来最好?是的,membership_id 是自动递增的。
  • @user9437856 - 它返回正确的结果,但可能比 JOIN 解决方案慢。然而,这取决于优化器。我会选择 JOIN 解决方案,因为我不相信它会更慢。
  • 我想,子查询比JOIN快
  • @user9437856 "subquery is faster than JOIN" - Mabe 在一个非常旧的版本中。但如果有疑问:创建一个包含大量虚拟数据的测试表并运行您的基准测试。
  • 我添加了 codeignator 代码。你能帮我如何在 codeignator 中转换 msql 查询吗?
猜你喜欢
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-27
  • 1970-01-01
相关资源
最近更新 更多