选择多行而不重复

时间:2017-09-22 01:58:32

标签: php mysql select distinct

有一个这样的表:

+---------+--------+--------+
| 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)”

我需要删除前缀为OR号的重复条目的字段,如下所示:

+---------+--------+--------+
| id      | prefix | number |
+---------+--------+--------+
| 2528361 | 100#11 | 4444   |
| 2528362 | 100#12 | 2222   |
+---------+--------+--------+
如果你能帮助我,我将非常感激。

1 个答案:

答案 0 :(得分: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个或更多)具有重叠的数字和前缀,则此逻辑可能会失败。在这种情况下,上述查询可能会丢失一些信息。但我仍然认为这是一个潜在的答案,因为你的样本数据并不意味着这种情况会发生。

<强>输出:

enter image description here

在这里演示:

Rextester