【问题标题】:How to select two columns together distinctly in no particular order?如何以没有特定的顺序清楚地选择两列?
【发布时间】:2020-05-25 01:14:03
【问题描述】:

我想在 MySQL 中以无特定顺序清楚地选择两列。

例如,给定的表格如下-

col1 col2 col3
--------------
a    b    val1
a    c    val2
b    a    val1
b    c    val3
c    a    val2
c    b    val3

我需要明确选择 col1col2,没有特定的顺序。

col1 = a AND col2 = b

等价于

col1 = b AND col2 = a

在我的例子中,col3 的值对于 col1 和 col2 的组合都是相同的。

预期结果如下 -

col1 col2 col3
--------------
a    b    val1
a    c    val2
b    c    val3

实际上我想消除重复。

您能提供的任何帮助将不胜感激。

提前谢谢你。

【问题讨论】:

  • 对不起@forpas,这是一个错字。已更正。谢谢。

标签: mysql sql database


【解决方案1】:

使用greatestleast 函数创建组:

SELECT col1, col2, col3
FROM (
      SELECT *,
             ROW_NUMBER() OVER(PARTITION BY least(col1, col2), greatest(col1, col2) ORDER BY least(col1, col2), greatest(col1, col2)) AS rn
      FROM mytable
) t
WHERE rn = 1

Demo

【讨论】:

    【解决方案2】:

    只是为了在性能调整方面为您提供替代且可能更好的解决方案,您可以在不使用窗口函数的情况下尝试以下查询 -

    SELECT * FROM mytable M1
    WHERE NOT EXISTS (SELECT 1 FROM mytable M2
                      WHERE M1.col1 = M2.col2
                      AND M1.col2 = M2.col1
                      AND M2.col1 < M2.col2)
    

    由于它使用exists子句,它会比上面的查询执行得更快。 Here 是两个查询的演示。

    【讨论】:

    • 是的,你说得对。我有一个 3M+ 行的表。 @blackbishop 的解决方案大约需要 36.5 秒,而您需要 0.0033 秒。谢谢。
    • Whattttt????看到这么大的性能差异后,即使是我也感到震惊。我想这一定是由于这个查询使用了索引。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多