MySQL 8 个具有最大 ID 的 DISTINCT

MySQL 8 DISTINCT with greatest ID

希望这是一个简单的问题,我只是想错了。

我在 id_1id_2 之间有关联。 id_1id_2之间存在1->n的关系。即,如果 id_1 不存在 id_2,则默认值为 -1。这看起来像:

id_1   id_2   info
---- | ---- | ----
120   -1      'dont'
120   444     'show'
123   -1      'test'
124   -1      'hello'
125   -1      'world'
125   123     'oh wait'
126   -1      'help'
126   201     'me'
127   -1      'sql'
127   206     'hell'

基本上我想要一个 SQL 查询,它获得与 id_1 关联的最高 id_2,给定 IN 语句匹配条件 id_1.如果我不能有一个也很好的 IN 语句,我只是想优化其他东西。

给定 id_1 包含 (123,124,125,126,127)id_2 包含 (-1,-1,123,201,206):

,答案应该是这样的
id_1   id_2   info
---- | ---- | ----
123    -1     'test'
124    -1     'hello'
125    123    'oh wait'
126    201    'me'
127    206    'hell'

注意 id_1 120 是如何被排除在外的。我试过:

SELECT DISTINCT id_1, id_2, info
FROM ids
WHERE
      id_1 IN (123, 124, 125, 126, 127) AND
      id_2 IN (-1, -1, 123, 201, 206)

但这为单个 id_1 提供了多个 id_2 值。

我也在 id_2 上尝试了 GROUP BY,但那只给我一个 id_1 有 -1.

SELECT id_1, id_2, info
FROM ids
WHERE
      id_1 IN (123, 124, 125, 126, 127) AND
      id_2 IN (-1, -1, 123, 201, 206)
GROUP BY id_2

结果:

id_1   id_2    info
----- | ---- | ----
123    -1     'test'
125    123    'oh wait'
126    201    'me'
127    206    'hell'

注意 124 中缺少的 id_1

那么我如何编写此查询来获取 id_1 的最新的、不同的 id_2

如果 MySQL 8+:

,您可以使用 ROW_NUMBER
WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY id_1 ORDER BY id_2 DESC) rn
    FROM ids
    WHERE id_1 IN (123, 124, 125, 126, 127) AND
          id_2 IN (-1, -1, 123, 201, 206)
)

SELECT id_1, id_2, info
FROM cte
WHERE rn = 1;

在 MySQL 的早期版本中,您可以使用存在逻辑确定每个 id_1 组的最大记录数:

SELECT i1.*
FROM ids i1
WHERE id_1 IN (123, 124, 125, 126, 127) AND
      id_2 IN (-1, -1, 123, 201, 206) AND
      NOT EXISTS (
          SELECT 1
          FROM ids i2
          WHERE i2.id_1 = i1.id_1 AND
                i2.id_2 > i1.id_2 AND
                i2.id_1 IN (123, 124, 125, 126, 127) AND
                i2.id_2 IN (-1, -1, 123, 201, 206)
      );