mysql - 如何获得具有最大值的不同行

标签 mysql group-by distinct max

我很抱歉问什么必须非常简单才能解决,但我似乎无法解决这个问题..我什至无法为我的问题想出一个真正合适的标题,请原谅也是如此。

我有一个民意测验,每个用户可以对一个问题发布多个答案,然后其他人对这些答案进行投票。我需要得到一个结果,其中返回每个用户投票最高的答案。

测试用例:让我们假设一个问题,例如“您最喜欢的歌曲名言是什么?”

CREATE TABLE `answers` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`authorId` INT,
`answer` TEXT NOT NULL ,
`votes` INT NOT NULL 
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci;

INSERT INTO `answers` VALUES
(1, 30, "The West is the Best", 120),
(2, 30, "Come on, baby, light my fire", 100),
(3, 31, "Everything's gonna be allright", 350),
(4, 31, "Sayin' oooh, I love you", 350),
(5, 31, "Singing sweet songs of melodies pure and true", 290),
(6, 32, "I'm your pole and all you're wearing is your shoes", 540),
(7, 32, "And I'm crazier when I'm next to her", 180),
(8, 32, "You hear the music in the air", 230),
(9, 30, "You know they are a liar", 190)

我期望得到的结果是:

id | authorId | answer                                             | votes
 6 |       32 | I'm your pole and all you're wearing is your shoes | 540
 3 |       31 | Everything's gonna be allright                     | 350
 9 |       30 | You know they are a liar                           | 190

基本上我需要为每位作者选择最佳答案,然后根据最佳答案获得的票数对结果进行排序。可能会出现同一作者的两个答案获得相同票数的情况;那么应该只选择第一个发布的(较低的 ID)(如答案 #3 和 #4 所示)。同一作者的两个不同答案可能永远不会出现在结果中 - 每个作者只能赢一次。

我搜索了又搜索又试了又试,此刻我觉得自己被洗脑了。可能这在单个 SQL 查询中是行不通的;如果是这样,可能值得指出该应用程序是用 PHP 编写的。我知道我可以用 ORDER BY votes desc, id asc 获取所有答案,然后遍历结果,记住所有 authorId 并用authorId 我已经看到了,但是我需要获取一定数量的记录,这可能会很尴尬(...如果我剔除太多行,可能需要使用偏移量再次运行查询等等)..但最后它可能是最好的解决方案,如果单一查询解决方案过于复杂或根本没有...

有什么想法吗? :o)

最佳答案

SELECT id, authorId, answer, votes
FROM (  SELECT id, authorId, answer, votes
        FROM answers
        ORDER BY votes DESC) AS h
GROUP BY authorId

这个巧妙的小技巧是基于 GROUP BY 构建的检索每个案例的第一行。通常这是默认的 ORDER BY id ASC , 但是通过这个子查询,每个 authorId 中的第一行最高votes .

注意:正如 Iain Elder 所提到的,此解决方案不适用于 ONLY_FULL_GROUP_BY活跃且仅适用于 MySQL。由于缺乏确认此行为的文档,此解决方案在一定程度上不受支持。它对我很有效,而且一直对我很有效。

此方法在最新的 MySQL on sqlfiddle 上仍然有效.

关于mysql - 如何获得具有最大值的不同行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12358842/

相关文章:

count - Spark:如何转换Dataframe API的count(distinct(value))

sql-server - 如何从日期/时间字段快速选择不同的日期,SQL Server

mysql - 我应该选择什么数据类型?

mysql - 对多列进行分组时如何选择最大值或最后一条记录?

php - Mysql join 或 php in_array() 哪个更适合优化 Mysql 查询?

MySQL只显示特定字段的第一行

sql - 获取 Oracle 上每个值的第二大最大值

php - 删除单元格 MySQL 中的重复值

PHP 从数据库表中下载特定行

php - 调用成员函数execute()