【问题标题】:MySQL: Ensure consecutiveness of numbers in a columnMySQL:确保列中数字的连续性
【发布时间】:2019-09-30 22:19:27
【问题描述】:

我需要一些有关 MySQL 查询的帮助。

假设我们有一个包含“id”、“unique_id”和“consecutive_id”列的表。 “id”列中的数字并不总是连续的,而我们必须在“consecutive_id”列中保持连续性。基本上每一行都应该有自己的连续编号,但有时可能会出现应该共享相同连续编号的行。这些行在“unique_id”列中具有相同的值。我需要一个查询来查找具有多个具有相同连续 ID 的行和一个不属于另一行的唯一 ID 的行的第一个 ID。

https://www.db-fiddle.com/f/hy8SACLyM2D65H2ZY31c2f/0 创建了一个小小提琴来演示我的问题。如您所见,ID 3 和 5 具有相同的连续编号 (2)。没关系,因为它们共享相同的唯一 ID。 ID 9、10、12 和 14 也具有相同的连续编号 (4),但只有 ID 9 和 10 具有相同的唯一 ID。因此,在这种情况下,查询应该找到 ID 12。

您能帮我开发一个解决方案吗?

非常感谢您提前提供的帮助。

一切顺利,

玛丽安

【问题讨论】:

  • 如果有 4 行具有相同的连续数字,其中 2 行具有相同的唯一 ID,另外两行也具有相同的唯一 ID(但与前两个不同)怎么办?其中哪些应该被认为是“错误的”并由查询返回?

标签: mysql numbers contiguous


【解决方案1】:

您可以使用COUNT(DISTINCT unique_id) 查找具有不同unique_idconsecutive_id 的值。

SELECT consecutive_id
FROM test 
GROUP BY consecutive_id 
HAVING COUNT(DISTINCT unique_id) > 1 

然后,您可以将其与原始表合并,按 unique_idconsecutive_id 分组,并获取计数为 1 的行,这意味着它们不等于其余的行组。

由于可能有多个异常值,您需要另一个级别的子查询来获取每个连续 ID 的最小异常值。

SELECT consecutive_id, MIN(id) as id
FROM (
    SELECT a.consecutive_id, MIN(id) AS id
    FROM test AS a
    JOIN (
        SELECT consecutive_id
        FROM test 
        GROUP BY consecutive_id 
        HAVING COUNT(DISTINCT unique_id) > 1) AS b
    ON a.consecutive_id = b.consecutive_id
    GROUP BY a.consecutive_id, a.unique_id
    HAVING COUNT(*) = 1) AS x
GROUP BY consecutive_id

DEMO

【讨论】:

  • Barmar,这就像一个魅力!非常非常感谢您的出色解决方案,祝您有美好的一天!玛丽安
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 2011-07-21
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多