【问题标题】:Opposite of Distinct in MySQLMySQL 中 Distinct 的对立面
【发布时间】:2012-08-15 20:29:19
【问题描述】:

我想知道 sql 中是否有“选择不同”的对立面,以便我可以用来从重复多次的表中获取值。

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:
    select some_column, count(*)
    from some_table
    group by 1
    having count(*) > 1;
    

    在 mysql 等数据库上,您甚至可以省略选择 count(*) 以保留列值:

    select some_column
    from some_table
    group by 1
    having count(*) > 1;
    

    【讨论】:

    • @bohemian group by 11 是什么意思,select 子句中的第一列?
    • group by 1 表示“在 select 子句中按列号 1 分组”,在这种情况下相当于编码 group by some_column。我更喜欢在分组时使用数字而不是列名,尤其是当列是计算时 - 它省去了重新编码整个计算的麻烦,当表达式很长时,这可能很难阅读
    • @Bohemian,“使用数字代替名称”是否适用于其他情况,还是仅适用于 group byorder by
    • @Pacerier 它仅适用于 group byorder by。它是 SQL 标准的一部分。
    • @Bohemian 很抱歉挖坟,但为了公开记录,我不能离开这个而不添加你仍然可以使用别名 - 例如SELECT SOME(BIG(CALC(my_column+42))) AS calculated FROM [...] GROUP BY calculated
    【解决方案2】:

    您需要一个带有having 子句的group by,例如:

    select person, count(friends)
    from people
    group by person
    having count(friends) > 1
    

    这将为您提供所有人及其朋友数量的列表,除了那些只与他们的母亲成为朋友的可怜的悲伤鞋底,或者更糟糕的是,甚至他们的母亲都没有:-)

    在这种情况下,您必须使用having 而不是where,因为前者在分组之后过滤,而后者在之前过滤,并且您没有像count() 这样的聚合函数的信息,直到 分组发生之后。

    【讨论】:

      【解决方案3】:

      我正在为多对多连接情况寻找类似的东西,我想显示两个表中存在多少重复项。 count(distinct col) 不是完全正确的解决方案,因为 '1' 的结果表明该列确实有重复,但没有说明有多少。我用于此的“不同的对立面”是使用 count(*): (count(*)-count(distinct col)+1) 的反转,它做得很好。

      【讨论】:

        猜你喜欢
        • 2013-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        • 2012-10-21
        • 2011-03-06
        相关资源
        最近更新 更多