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

Dan*_*era 4 mysql group-by max distinct

我很抱歉要问什么一定要解决这个问题很简单,但我似乎无法解决这个问题.我甚至无法为我的问题提出一个非常合适的标题,请原谅.

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

测试案例:让我们假设一个问题,如"你最喜欢的歌曲是什么?"

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)
Run Code Online (Sandbox Code Playgroud)

我期望获得的结果是:

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
Run Code Online (Sandbox Code Playgroud)

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

我已经搜索和搜索并尝试再次尝试,此刻我觉得很好洗脑了......可能这在单个SQL查询中是不可行的; 应该是这种情况,可能值得指出应用程序是用PHP编写的.我知道我可以抓住所有的答案,ORDER BY votes desc, id asc然后迭代结果,记住所有的authorIds并用authorId我已经看过的任何行扔掉,但我需要获得一定数量的记录,这可能会变得尴尬( ...可能需要再次运行带有偏移量的查询,如果我丢失了太多行等等.)但最终它可能是最好的解决方案,如果单查询解决方案过于复杂或根本没有...

有任何想法吗?:O)

Rob*_*lin 5

SELECT id, authorId, answer, votes
FROM (  SELECT id, authorId, answer, votes
        FROM answers
        ORDER BY votes DESC) AS h
GROUP BY authorId
Run Code Online (Sandbox Code Playgroud)

这个小巧巧妙的技巧是建立在GROUP BY检索每个案例的第一行的基础上的.通常这是默认情况下ORDER BY id ASC,但通过此子查询,每个中的第一行authorId具有最高votes.

注意:如Iain Elder所述,此解决方案不适用于ONLY_FULL_GROUP_BY活动,仅适用于MySQL.由于缺乏确认此行为的文档,此解决方案在某种程度上不受支持.它适用于我,但对我来说一直很好.

这个方法仍适用于sqlfiddle上的最新MySQL.