【问题标题】:MYSQL select DISTINCT values in two columnsMYSQL 在两列中选择 DISTINCT 值
【发布时间】:2011-10-08 08:31:19
【问题描述】:

我想在数据库中选择不同的值。让我通过一个简单的例子来告诉你。

表:

foo bar
--- ---
a   c
c   f
d   a
c   a
f   c
a   c
d   a
a   c
c   a
f   c

好吧,假设我的 SQL 是SELECT DISTINCT foo, bar from table。这些是我的结果:

foo bar
--- ---
a   c
c   f
d   a
c   a
f   c

但问题是 a c / c a 的重复只是它们的顺序不同。我不想选择这些,我想要两列的不同值,请帮忙!

【问题讨论】:

  • 这是您在某次采访中被问到的问题吗? :P
  • 不赞成这个问题,因为选择的答案让我害怕

标签: mysql sql


【解决方案1】:

使用 GROUP BY 怎么样?

SELECT foo,bar FROM my_table GROUP BY foo,bar

【讨论】:

  • 这是迄今为止更好的解决方案!
  • 绝对是一个更好的答案。
  • 怎么可能?这不是一个正确的答案。将 [foo=A, bar=C] 和 [foo=C, bar=A] 按 "foo,bar" 分组将产生两行。在这种情况下,OP 想要单行。
【解决方案2】:

非常非常邪恶和邪恶:

select distinct
    least(foo, bar) as value1
  , greatest(foo, bar) as value2
from table

【讨论】:

  • 这个请求是邪恶的。 foo 可以在 value1 中,也可以在 value2 中。 (刚刚测试过)
  • 无法正常工作。我的第一个选择返回了一个元组,例如(5, 108) - 第二个数字会非常大,我必须检查记录是否真的存在。我运行了一个选择,但它不是。
  • 我有一个解决这个问题布法罗的方法。 stackoverflow.com/a/50848228/8883361
【解决方案3】:

怎么样:

SELECT DISTINCT a.foo,a.bar 
FROM table a
LEFT JOIN table b ON a.foo=b.bar and a.bar=b.foo
WHERE b.foo IS NULL AND b.bar IS NULL

输出:

foo bar
--- ---
d   a

【讨论】:

  • @KevinBurton foobarWHERE 子句中不明确
【解决方案4】:
   SELECT 
       foo, bar
   FROM tableX
   WHERE foo <= bar
 UNION 
   SELECT 
       bar, foo
   FROM tableX
   WHERE bar < foo

【讨论】:

    【解决方案5】:

    您要求的是与对称闭包相反的东西(我不知道它是否有特殊名称;反对称的东西,因为它不是闭包)。对于需要比较两个不同列的闭包和闭包之类的事情,您可以使用连接。为确保在跨列重复时不会过滤掉两行,您需要一种区分重复并包含其中一个的方法,例如包含第一个较小的对。

    SELECT DISTINCT t1.foo, t1.bar
      FROM `table` t1
        LEFT JOIN `table` t2
          ON t1.foo=t2.bar AND t1.bar=t2.foo 
      WHERE t2.foo IS NULL OR t1.foo <= t1.bar;
    

    【讨论】:

    • 我正在尝试做一些类似于 OP 的事情。是否有一个好的教程和解释可用的链接?由于我们不确定术语,我很难在网上找到。
    【解决方案6】:
    SELECT DISTINCT foo, bar FROM table WHERE
    CONCAT(',',foo,bar,) NOT IN ( SELECT CONCAT(',',bar,foo) FROM table )
    

    【讨论】:

      【解决方案7】:

      这对我有用:

      SELECT DISTINCT
      LEAST(sub.foo, sub.bar) as value_1
      , GREATEST(sub.foo, sub.bar) as value_2
      
      FROM
      (SELECT
      a.foo
      ,a.bar
      FROM
      table a
      JOIN
      table b
      on a.foo = b.bar
      and a.bar = b.foo) sub
      

      【讨论】:

        【解决方案8】:

        所以我理解你想将 2 个字段组合成一个 SQL 搜索结果行...我发现这里的大多数答案都非常混乱。

        这是我在必要时总是这样做的方式(可以通过多行和多个表进行扩展):

        SELECT a.field1 FROM (<br>
        &nbsp;&nbsp;&nbsp;&nbsp;SELECT foo AS field1 FROM tableX<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNION<br>
        &nbsp;&nbsp;&nbsp;&nbsp;SELECT bar AS field1 FROM tableX<br>
        ) a
        
        OR
        
        SELECT DISTINCT a.field1 FROM (<br>
        &nbsp;&nbsp;&nbsp;&nbsp;SELECT foo AS field1, conditions FROM tableX<br>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UNION ALL<br>
        &nbsp;&nbsp;&nbsp;&nbsp;SELECT bar AS field1, conditions FROM tableX<br>
        ) a WHERE a.conditions=1 (added extra conditions to filter out some results)
        

        【讨论】:

          猜你喜欢
          • 2020-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-08
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          相关资源
          最近更新 更多