具有不同和最大值的MYSQL查询

Posted

技术标签:

【中文标题】具有不同和最大值的MYSQL查询【英文标题】:MYSQL Query with distinct and max 【发布时间】: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 |

【问题讨论】:

【参考方案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 重要的地方。

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

【讨论】:

以上是关于具有不同和最大值的MYSQL查询的主要内容,如果未能解决你的问题,请参考以下文章

通过显示错误 3065(HY000) 具有不同和顺序的 MySQL 查询

mysql 多表查询 比较两个字段最大、最小值,并显示对应字段

MySQL - 在一个查询中更新具有不同值的多行

具有不同的复杂 MySQL 查询

如何在 MySQL 中查询具有对象数组属性的对象?

Mysql查询选择2个具有1个不同的值[重复]