MySQL 8 个具有最大 ID 的 DISTINCT
MySQL 8 DISTINCT with greatest ID
希望这是一个简单的问题,我只是想错了。
我在 id_1
和 id_2
之间有关联。 id_1
和id_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)
);
希望这是一个简单的问题,我只是想错了。
我在 id_1
和 id_2
之间有关联。 id_1
和id_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)
);