【问题标题】:MySQL: Select distinct combinations accross two rows, not double countingMySQL:在两行中选择不同的组合,而不是重复计算
【发布时间】:2012-01-01 05:17:15
【问题描述】:

我有下表

  dc  rc
----------
  AE  GB
  DE  US
  CN  DE
  DE  TT
  US  DE
  GB  AE

我想选择所有唯一的 dc、rc 组合,但不考虑顺序。特别是,MySQL select 应该返回

  dc  rc
----------
  AE  GB
  DE  US
  CN  DE
  DE  TT

即它不应该重复计算 AE - GB 和 DE - US。我发现了一些类似的问题,例如当数据库是总是出现两次的关系之一时(例如在Filter SQL query by a unique set of column values, regardless of their order上)。但是,这里不是这种情况,因为不能保证该条目会出现两次(在大多数情况下不会出现)。

很明显,

SELECT DISTINCT dc, rc FROM table GROUP BY dc, rc

不会成功的。

感谢任何帮助

【问题讨论】:

    标签: mysql sql select distinct


    【解决方案1】:

    试试:

    (已编辑,包括其他列)

    select dc, rc, min(other_column1), sum(other_column2) /*etc as required*/
    from
    (select dc, rc, other_column1, other_column2 from table where rc >= dc
     union all
     select rc, dc, other_column1, other_column2 from table where rc < dc) v
    group by dc, rc
    

    【讨论】:

    • 抱歉,这不起作用。它给了我与运行“SELECT distinct dc, rc FROM table”时完全相同的结果,但也许设置操作是要走的路。我认为它可以通过在 SQL 语句中使用 NOT EXISTS 或 EXISTS 之类的东西来解决。这将只允许选择不同的 rc, dc 但如果已经选择了特定的 rc, dc 组合则不允许。但是我似乎无法管理这个......有什么建议吗?
    • @user1053779,您使用的是示例中提供的数据集吗?当我这样做时,我会得到你想要的输出数据集。
    • @Mark:它不完全相同的数据集,你是对的。我也尝试使用我提供的示例数据集,并且得到了正确的结果。我怎样才能让你查询工作?或者为什么它在实际表中不起作用?它基本上没有摆脱相反的双重条目......即它给了我美国 - 德和德 - 美国的组合......我不太明白。非常感谢你的帮助!该表有很多列,但本质上我选择了与示例数据集具有相同结构的两个子列 dc、rc。
    • @devmag:这是导致您的问题的附加列 - 您需要决定要对它们做什么(对它们求和,选择它们的最小值、最大值、平均值或其他聚合等)。
    【解决方案2】:

    这里有一个替代方案,应该提供与 Mark 相同的答案:

    SELECT A.DC, A.RC
    FROM tab A
    LEFT JOIN tab B
     ON A.DC = B.RC
    AND A.RC = B.DC
    AND A.DC >= B.DC
    WHERE B.RC IS NULL
    

    【讨论】:

      【解决方案3】:

      sql server 是我的东西,所以你可能需要翻译,但应该这样做

      Select Distinct dc, rc
      From
      ( Select dc,rc From SomeTable
        Union
        Select rc,dc From SomeTable
      ) BothWays
      

      联合有效地做了一个独特的,所以它应该工作。

      【讨论】:

      • 是的,它不知何故不起作用。我想关键是“双向”,这在 MySQL 中可能不可用。我已经考虑过可能为连接字符串的每个组合创建一个字段,然后按字母顺序对字符串进行排序。这可以给我一些与 US - DE DE - US 相同的东西,因此,我可以在这个“新标识符”上做一个不同的事情。然而,这个标识符可能不是唯一的。但是必须有办法在一个聪明的查询中做到这一点。
      • @devmag: BothWays 是一个表别名。
      猜你喜欢
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 2020-05-17
      • 2017-01-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多