【问题标题】:MySql: Select max value of per group with corresponding id of valueMySql:选择每个组的最大值与相应的值ID
【发布时间】:2016-06-08 12:00:46
【问题描述】:

从我的表中,我想在每个 user_id 组中选择最大喜欢和对应的 cat_id。

DROP TABLE IF EXISTS likes;
CREATE TABLE likes
(
  user_id int,
  likes int,
  cat_id int
);

insert into likes(user_id, likes, cat_id) values
(2, 5, 56), 
(2,6,61), 
(2,7,70), 
(3,10,56), 
(3,11,61),
(3,9,70),
(4,14,56),
(4,15,61),
(4,16,70);

http://sqlfiddle.com/#!9/51869/1

预期结果

  user_id   max(likes)  cat_id
       2          7        70
       3         11        61
       4         16        70

但在编辑器中结果不同。我做错了什么?

【问题讨论】:

  • 您的预期结果是什么?请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。
  • @JuanCarlosOropeza 预期结果显示有问题
  • 好的,我认为这是当前的结果...如果您阅读了这些链接,您应该始终在您的问题中包含这两个链接。当前和期望的输出。所以我们不会浪费时间尝试同样的事情。
  • @JuanCarlosOropeza 谢谢,下次会记住这一点
  • 同一个问题你问了两次,在stackoverflow.com/questions/35625612/…看我的回答

标签: mysql


【解决方案1】:

SQL Fiddle Demo

SELECT  likes.user_id, likes.likes, cat_id 
FROM likes
JOIN (
       Select user_id, max(likes) mlike
       from likes 
       group by user_id) T
    on likes.user_id = T.user_id
   and likes.likes = T.mlike

输出

| user_id | likes | cat_id |
|---------|-------|--------|
|       2 |     7 |     70 |
|       3 |    11 |     61 |
|       4 |    16 |     70 |

【讨论】:

  • 此查询依赖于实现细节 (dev.mysql.com/doc/refman/5.6/en/group-by-handling.html)。 MySQL 不承诺从聚合选择的同一行中读取非聚合字段。我假设如果 MAX() 被索引,它只会读取一条记录,所以你在那里很安全。
  • @sba 你确定吗?我知道mysql不是关于group by的ANSI。但只有一个字段user_id 并且我按该字段分组。所以这里没有任何非聚合字段
  • 对不起,我看错了。事实上,这样你就可以完全避免这个问题,很好的解决方案!
  • 现在我明白为什么我对这个查询感到困惑了。外部查询允许每个用户重复行。当两个类别共享相同的点赞数时,就会发生这种情况。外部查询也需要按user_id 分组。假设我们可以选择任何cat_id,当存在平局时,该字段可以根据口味设置为 MAX'd 或 MIN'd,因此修复很简单。
  • @sba 我不确定您是否仍然说这是错误的,或者您要求我帮助理解查询。无论如何,如果您看到查询不起作用的情况,您可以更新 SqlFiddle 以支持您的评论,我会看看
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多