【问题标题】:MYSQL Query with distinct and max具有不同和最大值的MYSQL查询
【发布时间】:2012-06-30 03:46:09
【问题描述】:

我需要一个 mysql 查询,它将选择“to”或“from”列中包含“joe”的所有行。它需要在“to”和“from”列之间区分,这意味着名称出现的顺序无关紧要。即“joe”、“bob”应与“bob”、“乔”。如果一对名称中有重复项,请选择具有最大 id 的名称。决赛桌也应该按 id 降序排序。例如,对下表运行查询:

之前:

id  to    from     
---|-----|------
1  | joe | bob | 
2  | bob | hal |
3  | joe | joe |
4  | sue | joe |
5  | bob | bob |
6  | bob | joe |
7  | hal | hal |
8  | joe | bob |

之后:

id  to    from     
---|-----|------
8  | joe | bob | 
4  | sue | joe |
3  | joe | joe |

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    尝试使用 GROUP BY,按字母顺序进行分组(从、到):

    SELECT id, `from`, `to`
    FROM yourtable
    WHERE id IN
    (
        SELECT MAX(id)
        FROM yourtable
        WHERE `from` = 'joe' OR `to` = 'joe'
        GROUP BY LEAST(`from`, `to`), GREATEST(`from`, `to`)
    )
    ORDER BY id DESC
    

    在线查看:sqlfiddle

    【讨论】:

    • 我是不是误读了这个问题 - 但不是像 SELECT DISTINCT * FROM table WHERE to='joe' OR from='joe' 这样简单的 OP 原始问题的答案
    • @AdrianCornish:返回 5 行而不是 OP 所需的 3 行。自己看:sqlfiddle.com/#!2/fc622/5
    • 你是对的 - 我错了 - 抱歉是在阅读他的问题而不是查看他的预期结果集 - 现在我明白了 GROUP BY 的原因
    • 我有时认为自己是一名 SQL 专家 - 从未与 LEASTGREATEST 打过交道。太棒了!
    【解决方案2】:

    嗯...我可以接近:

    SELECT inside.id, inside.`to` , inside.`from` 
    FROM (
      SELECT MAX( id ) id,  `to` ,  `from` 
      FROM people
      WHERE  `to` =  'joe'
      OR  `from` =  'joe'
      GROUP BY  `to` ,  `from`
    )inside
    ORDER BY inside.id DESC
    

    但这并不能完全给出你想要的结果,因为在交换 to 和 from 时它仍然有欺骗。

    我正在尝试使用一些 UNION,但这实际上使问题复杂化,因为它最终会创建更多独特的列(我会交换 tofrom 的顺序以让所有 joe 进入同一列)。一旦你得到了正确的唯一行而不考虑 tofrom 的重要性,就很难将它返回到 tofrom 重要的地方。

    也许这会让你开始思考,而我对此感到困惑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多