从MYSQL数据库中查找所有但最后重复的记录

时间:2018-08-01 07:30:07

标签: mysql sql row-number

我有一个带有以下记录的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  |
-------------------------------

我该如何实现?

1 个答案:

答案 0 :(得分:2)

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

  1. 通过COUNT列获取name总数,以获取MAX行号。
  2. 使用Row_number中的name获取行号。
  3. 要编写条件,请从总数name中减去count的最后一个行号

如果您的mysql版本支持窗口功能,则可以尝试以下代码。

制作Row_numberCOUNT,然后用Row_number删除较大的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不支持窗口功能,则可以尝试此查询。

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 |