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

k10s72fa  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(585)

我有一个mysql表,其中包含以下记录

-------------------------------
| 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  |
-------------------------------

我怎样才能做到这一点?

q5lcpyga

q5lcpyga1#

我将在中创建两个新列 COUNT 以及 Row_number 结果是因为
得到 COUNT 总数(按) name 列以获取 MAX 行数。
使用 Row_numbername 获取行数。
写入排除最后一行的条件 name 从总计 count 如果你的mysql版本支持window函数你可以试试这个代码。
制造 Row_number 以及 COUNT 然后移除较大的 Row_numberName .

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 自动增量列和您的mysql不支持窗口功能您可以尝试此查询。

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 |

相关问题