从 MYSQL 数据库中查找除最后一个重复记录之外的所有记录

Find All but last duplicate records from MYSQL database

我有一个 mysql table 有以下记录

-------------------------------
| ID | Name | Age | XXX | YYY |
-------------------------------
| 1  | aa   | 12  | qqq | rr  |
-------------------------------
| 2  | aa   | 12  | ttt | pp  |
-------------------------------
| 3  | bb   | 13  | qhq | rr  |
-------------------------------
| 4  | bb   | 13  | pqq | tr  |
-------------------------------
| 5  | bb   | 13  | ql  | jjn |
-------------------------------

我的要求是检索除最后一个条目之外的第一列的所有重复记录。目前我尝试检索重复项并且工作正常

SELECT Name, Age, XXX, YYY FROM list
INNER JOIN (SELECT Name
           FROM   list
           GROUP  BY Name
           HAVING COUNT(Name) > 1) dup
           ON list.Name = dup.Name;

输出就像

-------------------------------
| ID | Name | Age | XXX | YYY |
-------------------------------
| 1  | aa   | 12  | qqq | rr  |
-------------------------------
| 2  | aa   | 12  | ttt | pp  |
-------------------------------
| 3  | bb   | 13  | qhq | rr  |
-------------------------------
| 4  | bb   | 13  | pqq | tr  |
-------------------------------
| 5  | bb   | 13  | ql  | jjn |
-------------------------------

但我想从输出中删除最后一条记录,如

-------------------------------
| ID | Name | Age | XXX | YYY |
-------------------------------
| 1  | aa   | 12  | qqq | rr  |
-------------------------------
| 3  | bb   | 13  | qhq | rr  |
-------------------------------
| 4  | bb   | 13  | pqq | tr  |
-------------------------------

我怎样才能做到这一点?

我会在 COUNTRow_number 中创建两个新列,因为

  1. 通过 name 列获取 COUNT 总数以获得 MAX 行号。
  2. 使用 Row_number by name 获取行号。
  3. 要写入条件,请从总数 count
  4. 中排除最后一个行号 name

如果你的mysql版本支持window功能你可以试试这个代码。

制作 Row_numberCOUNT 然后删除更大的 Row_number by Name.

SELECT  *
FROM (
  select *,
         Row_number() over(partition by Name order by ID) rn,
         COUNT(*) over(partition by Name) totle
  from `list` 
) t1
where rn <> totle

sqlfiddle

编辑

如果您有 ID auto_increment 列并且您的 mysql 不支持 window 函数 您可以试试这个查询。

SELECT id,Name,Age,XXX,YYY
FROM (
  SELECT *,
         (SELECT COUNT(*) FROM `list` t1 WHERE t.ID >= t1.ID AND t.Name = t1.Name) rn,
         (SELECT COUNT(*) FROM `list` t1 WHERE t.Name = t1.Name) totle
  FROM `list` t
) t1 
where rn <> totle

sqlfiddle

[结果]:

| id | Name | Age | XXX | YYY |
|----|------|-----|-----|-----|
|  1 |   aa |  12 | qqq |  rr |
|  3 |   bb |  13 | qhq |  rr |
|  4 |   bb |  13 | pqq |  tr |