首页 > 解决方案 > 如何在 MySQL 数据库中按域分组并删除两个以上的结果

问题描述

我有一个问题,
我想对我的表进行分组,并为每个域仅显示 MAX 两个值(例如,按字母顺序排列)。

表名 = table1
MySQL 数据库

例如: 在此处输入图像描述

得分:
aa@aa.com
bb@aa.com
aa@example.com
cc@example.com
a@domain.com

如您所见,查询应按域分组,并且每个域仅显示MAX TWO记录

你能帮助我吗?

标签: mysqlsqlselectgroup-bygrouping

解决方案


MySQL 8.0.2 及更高版本中,可以使用窗口函数以不那么冗长的方式解决此问题。

对于您的 MySQL 5.1.73 版本,我们可以使用会话变量来模拟:

SELECT 
  dt2.Email, 
  dt2.Domain 
FROM 
(
  SELECT 
    @row_num := IF(@dmn <> dt1.Domain, 1, @row_num + 1) AS row_no, 
    @dmn := dt1.Domain AS Domain, 
    dt1.Email 
  FROM 
  (
    SELECT 
      Email, 
      Domain 
    FROM Table1 
    ORDER BY Domain 
  ) AS dt1 
  CROSS JOIN (SELECT @row_num := 0, 
                     @dmn := '') AS user_init_vars 
) AS dt2 
WHERE dt2.row_no <= 2 
ORDER BY dt2.Domain 

DB 小提琴演示

您可以按照本教程了解此方法的工作原理:http ://www.mysqltutorial.org/mysql-row_number/


推荐阅读