【发布时间】:2012-08-15 20:29:19
【问题描述】:
我想知道 sql 中是否有“选择不同”的对立面,以便我可以用来从重复多次的表中获取值。
谢谢
【问题讨论】:
标签: mysql
我想知道 sql 中是否有“选择不同”的对立面,以便我可以用来从重复多次的表中获取值。
谢谢
【问题讨论】:
标签: mysql
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;
【讨论】:
group by 1 的1 是什么意思,select 子句中的第一列?
group by 1 表示“在 select 子句中按列号 1 分组”,在这种情况下相当于编码 group by some_column。我更喜欢在分组时使用数字而不是列名,尤其是当列是计算时 - 它省去了重新编码整个计算的麻烦,当表达式很长时,这可能很难阅读
group by 和 order by?
group by 和 order by。它是 SQL 标准的一部分。
SELECT SOME(BIG(CALC(my_column+42))) AS calculated FROM [...] GROUP BY calculated
您需要一个带有having 子句的group by,例如:
select person, count(friends)
from people
group by person
having count(friends) > 1
这将为您提供所有人及其朋友数量的列表,除了那些只与他们的母亲成为朋友的可怜的悲伤鞋底,或者更糟糕的是,甚至他们的母亲都没有:-)
在这种情况下,您必须使用having 而不是where,因为前者在分组之后过滤,而后者在之前过滤,并且您没有像count() 这样的聚合函数的信息,直到 在分组发生之后。
【讨论】:
我正在为多对多连接情况寻找类似的东西,我想显示两个表中存在多少重复项。 count(distinct col) 不是完全正确的解决方案,因为 '1' 的结果表明该列确实有重复,但没有说明有多少。我用于此的“不同的对立面”是使用 count(*): (count(*)-count(distinct col)+1) 的反转,它做得很好。
【讨论】: