【问题标题】:MySQL/MariaDB GROUP BY, ORDER BY returns same result twiceMySQL/MariaDB GROUP BY,ORDER BY 两次返回相同的结果
【发布时间】:2015-05-05 05:01:36
【问题描述】:

假设我有下表

+----+--------+--------+
| id | result | person |
+----+--------+--------+
|  1 |      1 |      1 |
|  2 |      2 |      2 |
|  3 |      2 |      2 |
|  4 |      4 |      3 |
|  5 |      4 |      1 |
|  6 |      1 |      2 |
+----+--------+--------+

现在我想按从高到低排序的每个人得到最好的结果,其中最好的结果意味着result-column 的最高值,所以基本上我想 GROUP BY person 和 ORDER BY result。此外,如果一个人多次获得相同的结果,我只想返回其中一个结果。所以我想要的回报是这样的:

+----+--------+--------+
| id | result | person |
+----+--------+--------+
|  4 |      4 |      3 |
|  5 |      4 |      1 |
|  2 |      2 |      2 |
+----+--------+--------+

以下查询几乎可以让我到达那里:

SELECT id, groupbytest.result, groupbytest.person
FROM groupbytest
JOIN (
    SELECT MAX(result) as res, person
    FROM groupbytest
    GROUP BY person
) AS tmp
ON groupbytest.result = tmp.res
AND groupbytest.person = tmp.person
ORDER BY groupbytest.result DESC;

但是为同一个人返回两行,如果此人两次取得相同的最佳结果,那么我得到的是

+----+--------+--------+
| id | result | person |
+----+--------+--------+
|  4 |      4 |      3 |
|  5 |      4 |      1 |
|  2 |      2 |      2 |
|  3 |      2 |      2 |
+----+--------+--------+

如果同一个人的两个结果相似,则应仅返回 id 最低的一个,因此不应返回 id 为 2 和 3 的行,而应仅返回 id 为 2 的行。

有什么想法可以实现吗?

【问题讨论】:

  • 如果出现平局,应该怎么做呢?
  • @Strawberry 应该只返回一个(假设是具有最低 id 的那个)结果。因此,应该只返回 id 为 2 的行,而不是返回 id 为 2 和 3 的行。
  • 请相应地编辑您的问题。

标签: mysql group-by sql-order-by mariadb


【解决方案1】:

试试这个:

SELECT ttable.* from ttable 
inner join 
(
SELECT max(ttable.id) as maxid  FROM `ttable` 
inner join  (SELECT max(`result`) as res, `person` FROM `ttable` group by person) t
on
ttable.result = t.res
and
ttable.person =  t.person

group by ttable.person ) tt
on
ttable.id = tt.maxid

【讨论】:

  • 嗨@OTARIKI。感谢您的建议,但这仅在 min(result) == max(result) 时有效。我现实人 2 也可能有更差的结果(例如 1),在这种情况下,它仍然会返回 2 行结果为 2。我已更新问题以在表中包含另一行。
【解决方案2】:

检查 tmp 是否生成正确的结果表。我认为 tmp 应该正确分组。连接会添加新行,因为您有不同的“id”值。 因此,具有不同 id 的行将被视为不同的行,无论其他列是否相等。只要没有重复的 id,您就没有重复的结果。尝试从 SELECT 中删除 id。那么你应该得到你想要的结果,但没有 id。

示例:从上方想象带有您 ID 的房间。让 result 是房间里桌子的数量, person 是人数。仅仅因为您在 2 号和 3 号房间随机有相同数量的桌子和人数,并不意味着这是相同的房间。

【讨论】:

  • 嗨。感谢您的快速回复。 tmp 确实包含正确的结果,但不是(必然)以正确的顺序。我也想得到结果的 id 以及结果和人,所以删除 not SELECTing id 并不是我真正想要的。
猜你喜欢
  • 2015-07-14
  • 1970-01-01
  • 2012-09-29
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-18
相关资源
最近更新 更多