mysql 设置 distinct_mysql – 使用distinct与所有属性

如果你想在结果中,每个id一行,你可以使用GROUP BY id.但是,不建议使用SELECT列表中的其他列(即使MySQL允许它 – 这取决于您是否将ANSI设置为On或Off).建议使用具有聚合函数的其他列,如MIN(),MAX(),COUNT()等.在MySQL中,还有一个GROUP_CONCAT()聚合函数,它将从一个列的列中收集所有值:

SELECT

id

, COUNT(*) AS number_of_rows_with_same_id

, MIN(col1) AS min_col1

, MAX(col1) AS max_col1

--

, GROUP_CONCAT(col1) AS gc_col1

, GROUP_CONCAT(col2) AS gc_col2

--

, GROUP_CONCAT(col16) AS gc_col16

FROM

abc

GROUP BY

id ;

查询:

SELECT *

FROM abc

GROUP BY id ;

是无效的SQL(最多92个),因为您在SELECT列表中有非聚合结果,在SQL(2003)中有效.但是,它在这里是无效的,因为其他列在功能上不依赖于分组列(id).不幸的是,MySQL允许这样的查询,并且不检查功能依赖性.

所以,你永远不会知道将返回哪一行(具有相同id的许多行),甚至 – 恐怖! – 您从不同的行(具有相同的ID)获得结果.正如@Andriy评论的那样,结果是id之外的列的值将被任意选择.如果您想要可预测的结果,请不要使用这种技术.

示例解决方案:如果您只需要每个id中的一行,并且您有一个可用于排序的日期时间或时间戳(或其他一些)列,则可以执行以下操作:

SELECT t.*

FROM abc AS t

JOIN

( SELECT id

, MIN(some_column) AS m -- or MAX()

FROM abc

GROUP BY id

) AS g

ON g.id = t.id

AND g.m = t.some_column ;

只要(id,some_column)组合是唯一的,这将起作用.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值