【问题标题】:Show all the groupped value that have same value more than 1显示所有相同值大于 1 的分组值
【发布时间】:2020-10-25 13:54:07
【问题描述】:

我有这样的桌子

table1

| ID  |  Val |  Val2  |
|  2  |  AA  |   0    |
|  3  |  AA  |   1    |
|  4  |  AD  |   0    |
|  5  |  CV  |   1    |
|  6  |  AF  |   1    |
|  7  |  CV  |   1    |

我想知道Val 列中是否有多个重复值。我使用了group by 子句。另外我想知道Val中出现了多少重复项

select Val,count(Val) from table 
group by Val where 
having count(val) > 1

结果:

| Val | count(val) |
| AA  |   2        | 
| CV  |   2        |

现在我想知道哪一列有重复值,所以我使用 Group_concat 进行这样的查询

select Val,count(Val), group_concat(ID) from table1 
group by Val where 
having count(val) > 1

结果

| Val | count(val) | group_concat(ID) |
| AA  |   2        |  2,3             |
| CV  |   2        |  5,7             |

现在我不知道如何显示所有重复值,我只通过 group_concat() 显示具有重复值的 id,但如果没有 group_concat 列,我无法显示所有数据。我尝试使用Field_in_set,但它似乎不起作用。

select Val,count(Val), group_concat(ID) from table1 
where FIELD_IN_SET(ID,group_concat(ID))
group by Val where 
having count(val) > 1

我希望在group bycount 之后显示所有重复值,如下表所示

| ID  |  Val |  Val2  |
|  2  |  AA  |   0    |
|  3  |  AA  |   1    |
|  5  |  CV  |   1    |
|  7  |  CV  |   1    |

【问题讨论】:

    标签: mysql group-by having


    【解决方案1】:
    CREATE TABLE table1 (
      `ID` INTEGER,
      `Val` VARCHAR(2),
      `Val2` INTEGER
    );
    
    INSERT INTO table1
      (`ID`, `Val`, `Val2`)
    VALUES
      ('2', 'AA', '0'),
      ('3', 'AA', '1'),
      ('4', 'AD', '0'),
      ('5', 'CV', '1'),
      ('6', 'AF', '1'),
      ('7', 'CV', '1');
    
    SELECT  t1.* 
    FROM table1 t1 
      INNER JOIN (SELECT COUNT(`Val`) countval, `Val`  FROM table1 GROUP BY `Val`) t2 
        ON t1.`Val` = t2.`Val`
    WHERE countval > 1
    
    身份证 |瓦尔 | VAL2 -: | :-- | ---: 2 |机管局 | 0 3 |机管局 | 1 5 |简历 | 1 7 |简历 | 1
    SELECT `ID`, `Val`, `Val2`     
    FROM ( SELECT
             `ID`, `Val`, `Val2`,
             COUNT(`Val`) OVER(PARTITION BY `Val`) c1
           FROM table1) t1
       WHERE c1 > 1
    
    身份证 |瓦尔 | VAL2 -: | :-- | ---: 2 |机管局 | 0 3 |机管局 | 1 5 |简历 | 1 7 |简历 | 1

    db小提琴here

    【讨论】:

    • 我收到一个错误You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '( PARTITION BY NIK`) c1 FROM bansos_tahap4_wilayah_tanpa_ber_iris_ojol_vp) t1' 在第 4 行`
    • 第二个代码只在 mysql 8 中有效,我把两者都放在那里,今天很难分辨 ypu 有哪个版本
    • 哦,我明白了,我用的是 mysql 5.7。非常感谢,看来我只能使用第一个
    【解决方案2】:

    如果您想返回包含重复 Vals 的行,请使用 EXISTS

    select t.* from tablename t 
    where exists (select 1 from tablename where Val = t.Val and ID <> t.ID) 
    

    请参阅demo
    结果:

    | ID  | Val | Val2 |
    | --- | --- | ---- |
    | 2   | AA  | 0    |
    | 3   | AA  | 1    |
    | 5   | CV  | 1    |
    | 7   | CV  | 1    |
    

    【讨论】:

    • 如果我希望重复值大于 2 怎么办?我怎么能这样做?
    • select t.* from tablename t where t.Val in (select Val from tablename group by Val having count(*) &gt; 2)
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 2014-12-08
    • 2016-03-09
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多