【问题标题】:Select multiple row without duplicate选择多行不重复
【发布时间】:2017-09-22 01:58:31
【问题描述】:

有一张这样的表:

+---------+--------+--------+
| id      | prefix | number |
+---------+--------+--------+
| 2528361 | 100#11 | 4444   |
| 2528364 | 100#13 | 4444   |
| 2528362 | 100#12 | 2222   |
| 2528363 | 100#12 | 3333   |
+---------+--------+--------+

查询是“SELECT id, prefix, number WHERE (SOME_AND_OR)”

我需要删除那些在前缀或编号上有重复条目的字段,如下所示:

+---------+--------+--------+
| id      | prefix | number |
+---------+--------+--------+
| 2528361 | 100#11 | 4444   |
| 2528362 | 100#12 | 2222   |
+---------+--------+--------+

如果您能帮助我,将不胜感激。

【问题讨论】:

  • 你可以通过GROUP BY来做到这一点
  • 如果一组三个记录同时重叠前缀和数字会发生什么?
  • GROUP by on single field 将删除该字段上的重复项,并且在多个字段上将检查这些字段的组合,我想在每个字段上区分

标签: php mysql select distinct


【解决方案1】:

我们可以尝试做一个双重聚合,一个删除前缀中的重复项,另一个删除数字中的重复项。首先,在单独的视图中对前缀进行聚合:

CREATE VIEW yourView AS
SELECT p1.*
FROM yourTable p1
INNER JOIN
(
    SELECT prefix, MIN(number) AS min_number
    FROM yourTable
    GROUP BY prefix
) p2
    ON p1.prefix = p2.prefix AND p1.number = p2.min_number

然后,对数字进行第二次聚合:

SELECT v1.*
FROM yourView v1
INNER JOIN
(
    SELECT number, MIN(prefix) AS min_prefix
    FROM yourView
    GROUP BY number
) v2
    ON v1.number = v2.number AND v1.prefix = v2.min_prefix

请注意,如果一组记录(例如 3 个或更多记录)具有重叠的数字和前缀,则此逻辑可能会失败。在这种情况下,上述查询可能会丢失一些信息。但我仍然将此作为潜在的答案,因为您的示例数据并不意味着这会发生。

输出:

演示在这里:

Rextester

【讨论】:

    猜你喜欢
    • 2011-12-17
    • 2010-10-06
    • 2017-05-12
    • 2014-03-03
    • 2013-01-12
    • 2021-01-11
    • 2020-10-01
    • 2017-08-26
    • 1970-01-01
    相关资源
    最近更新 更多