mysql - 如何从 (s,d) 对表中有效过滤 s 和 d 的重复值,仅保留最小的 (s,d) 对

标签 mysql sql join

这是我的测试用例

CREATE TABLE matches AS
        SELECT 1 s, 2 d
  UNION SELECT 1, 3 -- (1,2) preferred
  UNION SELECT 2, 2 -- (1,2) preferred
  UNION SELECT 2, 3
  UNION SELECT 3, 3 -- (2,3) preferred
  UNION SELECT 3, 4;

我想过滤此表并仅保留每个 s 或 d 值一次,优先考虑最小的 (s,d) 对。结果应为(1,2),(2,3),(3,4)。 如何有效地做到这一点?

我尝试了下面的查询,但只有当与不同 s 值关联的 d 值不重叠时它才有效

SELECT * FROM (
   SELECT
     *,
     row_number() OVER (PARTITION BY s ORDER BY d) rs,
     row_number() OVER (PARTITION BY d ORDER BY s) rd
    FROM matches
   ) t
WHERE rd = rs;

任何帮助将不胜感激。

最佳答案

如果我正确地解释了您的意图,您可以通过将表复制到一个新的(可能是临时的)表来实现此目的,该表在 sd 上具有唯一索引并使用 INSERT IGNORE 复制数据:

CREATE TABLE matches AS
        SELECT 1 s, 2 d
  UNION SELECT 1, 3 -- (1,2) preferred
  UNION SELECT 2, 2 -- (1,2) preferred
  UNION SELECT 2, 3
  UNION SELECT 3, 3
  UNION SELECT 3, 4;

CREATE TABLE matches2 (s INT, d INT);
ALTER TABLE matches2 ADD UNIQUE KEY (s), ADD UNIQUE KEY(d);

INSERT IGNORE INTO matches2 
SELECT * FROM matches ORDER BY s, d;

SELECT * FROM matches2

输出:

s   d
1   2
2   3
3   4

关于mysql - 如何从 (s,d) 对表中有效过滤 s 和 d 的重复值,仅保留最小的 (s,d) 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52404942/

相关文章:

java - sql查询进入hibernate

mysql - 自连接查询值不匹配

C# SQL/Linq/Entity Framework 计算来自大数据源的多列的列总计

php - 如何在变量中存储选择选项 onchange 并将其作为参数传递到单个 php 页面

php - 如何使用ajax在地址栏中显示选定的表格行id

sql - 如何向 SQL 中的重复数据集添加计数器?

sql - Laravel 外键 onDelete ('cascade' ) 不起作用

r - 将两个 sampleID 的相应值连接到一个新的单列中

mysql - 在没有主键时检测相同的行

mysql - 连接表中限制1?