如何获得与最大值不同行(how to get distinct rows with max valu

2019-06-28 04:03发布

我的道歉问什么必须要解决很简单,但我似乎无法总结我的脑海围绕这个..我甚至不能拿出我的问题一个非常合适的题目,请您赦免为该以及。

我有一个调查,其中每个用户可以张贴多个答案的问题,然后其他人对这些答案进行投票。 我需要在那里得到返回的所有用户的,投票最高的答案的结果。

测试案例:假设一个问题,如“什么是你最喜欢的歌的报价?”

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 S和扔出去有任何行authorId我已经看到了,但我需要获得一组记录数和可以得到的尴尬(...将可能需要偏移再次运行查询,如果我扔掉了太多的行等)。但如果最终单查询解决方案是它可能是最好的解决办法过于复杂或者根本没有...

有任何想法吗? :O)

Answer 1:

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

注:由于伊恩长老提到,这种解决方案不工作ONLY_FULL_GROUP_BY活跃,仅在MySQL工作。 该解决方案是在一定程度上不支持的,由于缺乏确认文档此行为。 它非常适合我,一直运作良好,对我来说不过。

这种方法仍然适用于最新的sqlfiddle的MySQL 。



Answer 2:

您可以使用子选择:

select min(a1.id), a1.authorid, a2.mxvotes
from answers a1
inner join
(
  select authorid, max(votes) mxvotes
  from answers
  group by authorid
) a2
  on a1.authorid = a2.authorid
  and a1.votes = a2.mxvotes
group by a1.authorid, a2.mxvotes
order by mxvotes desc

看到SQL拨弄演示



Answer 3:

大的问题,丹。

MySQL的缺乏分析功能,使这个容易解决。 一个类似的问题已经被问的Oracle,并且使用与MAX功能OVER子句得到解决。 这工作SQL Server上了。

您需要使用子查询做到这一点在MySQL。 这对我的作品:

SELECT
  id,
  authorId,
  answer,
  votes
FROM answers AS firsts
WHERE id = (
  SELECT
    MIN(id)
  FROM answers AS favorites
  WHERE
    votes = (
      SELECT MAX(votes)
      FROM answers AS author_max
      WHERE author_max.authorId = favorites.authorID
    ) AND
    favorites.authorId = firsts.authorId 
)
ORDER BY votes DESC;

见我sqlfiddle一个可执行的例子。



Answer 4:

select * from (select * from answers order by votes desc) as temp group by authorId


文章来源: how to get distinct rows with max value