【问题标题】:Select similar records from mysql从mysql中选择相似的记录
【发布时间】:2016-04-24 09:25:55
【问题描述】:

我有一个如下图所示的数据库

ID    color number          code
102966  red 1   9f6606069f9b999b
102968  red 1   9f6606069f9b999b
102967  red 1   9f0606069f9f9f9f
102969  red 1   9f0606069f9f9f9f
103630  red 1   bbff9f0f8fdc9f7e
101582  red 1   bbff9b0fcf9f99d9
102000  red 1   99fd9f0fab999fff
101603  red 1   bbff9f0d8f9d96df
102016  red 1   bbff9900c09999df

此表有超过 4000 个条目。 我使用

得到了这个输出
Select * from mytable order by code asc

现在我希望输出为 Id-Id-Id....,其中代码相似。 所以对于给定的 sn-p 它应该像

102966-102968
102967-102969

所以我希望那些记录是相似的,它们的代码应该是这样的。 请帮忙。

【问题讨论】:

  • 折叠成范围并不总是一件小事。如果某些数字被跳过,您将无法执行简单的MIN()MAX()
  • “相似”是什么意思?例如,为什么101603102016 相关,即使它们没有相同的代码?如果存在三个或更多具有“相似”代码的 ID,它们应该显示为 ID-ID-ID-... 还是仅用于对?没有配对的 ID 是否应该从列表中排除?

标签: mysql sql database stored-procedures


【解决方案1】:

我真的不明白你最后的结果行是关于什么的,这可能是一个错误或者我不明白你需要什么

我想你正在寻找group_concat

select group_concat(ID ORDER BY ID SEPARATOR '-' ) AS dup
from mytable
GROUP BY code
HAvING count(*) >1
ORDER BY dup    

结果:

|           dup |
|---------------|
| 102966-102968 |
| 102967-102969 |

group_concat 显示与GROUP BY 匹配的所有值,这里是ID 值。 术语SEPARATOR 用于将- 指定为您的ID 之间的分隔符,因为默认分隔符是,

如果您想要所有行,即使是那些没有重复 code 的行,请删除 having 子句

SQL Fiddle

【讨论】:

    【解决方案2】:

    @Thomas G 的最后一个答案是正确的,但如果你想按正确的顺序使用:

    select CONCAT(MIN(ID),'-',MAX(ID))
    from mytable
    GROUP BY code
    HAvING count(*) >1
    

    【讨论】:

    • 这也适用于给定的数据集,但如果每个 code 有超过 2 个重复项怎么办?看起来它可能会像他所说的那样发生Id-Id-Id ;-)
    • 一系列AABBAACC会导致A在本例中显示为1-6,这是错误的。我认为应该是 1-2、5-6。这就是让事情变得非常复杂的原因。
    • 你可以使用GROUP_CONCAT(.. ORDER BY ..)
    猜你喜欢
    • 2020-11-02
    • 1970-01-01
    • 2011-04-11
    • 2019-03-02
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多