相关疑难解决方法(0)

SQL仅选择列上具有最大值的行

我有这个文件表(这里是简化版):

+------+-------+--------------------------------------+
| id   | rev   | content                              |
+------+-------+--------------------------------------+
| 1    | 1     | ...                                  |
| 2    | 1     | ...                                  |
| 1    | 2     | ...                                  |
| 1    | 3     | ...                                  |
+------+-------+--------------------------------------+
Run Code Online (Sandbox Code Playgroud)

如何为每个id选择一行并且只选择最大转速?
使用上面的数据,结果应该包含两行:[1, 3, ...][2, 1, ..].我正在使用MySQL.

目前,我在while循环中使用检查来检测并覆盖结果集中的旧转速.但这是实现结果的唯一方法吗?是不是有SQL解决方案?

更新
作为答案提示,有一个SQL的解决方案,并且这里sqlfiddle演示.

更新2
我注意到在添加上述sqlfiddle之后,问题被投票的速率超过了答案的upvote率.那不是故意的!小提琴是基于答案,特别是接受的答案.

mysql sql aggregate-functions greatest-n-per-group groupwise-maximum

1142
推荐指数
14
解决办法
107万
查看次数

团体内的订单?

在我的系统中,我有客户.客户有程序.我想显示一个客户列表,显示它们最近的活动(如果存在)程序.

因此,我们有这样的事情:

SELECT * 
FROM clients AS client 
    JOIN programs AS program ON client.id=program.client_id
GROUP BY client.id
ORDER BY program.close_date=0 DESC, program.close_date DESC
Run Code Online (Sandbox Code Playgroud)

close_date=0表示该程序未关闭.因此,它将把非封闭程序放在第一位,然后是最近关闭的程序.

问题是,订单在组内不起作用.它只是随机选择其中一个程序.我该如何解决这个问题?


刚想出来:

SELECT * 
FROM clients AS client 
    JOIN (SELECT * FROM programs AS program ORDER BY program.close_date=0 DESC, program.close_date DESC) AS program ON client.id=program.client_id
GROUP BY client.id
Run Code Online (Sandbox Code Playgroud)

这似乎给出了正确的结果.这是正确的,还是我很幸运?也就是说,我在加入之前基本上对表格进行了排序; 这些结果会像加入一样保持排序,对吧?


解决方案:我现在相信这是一个典型的分组最大问题.如果您遇到类似问题,请搜索该问题.该解决方案涉及两次加入同一个表.

mysql greatest-n-per-group

9
推荐指数
1
解决办法
8042
查看次数

如何优化MySQL查询(组和顺序)

嘿所有,我有一个需要优化的查询.它有效,但它是一只狗,性能明智.

它看起来像这样:

SELECT  *
FROM    (
        SELECT  *
        FROM    views
        WHERE   user_id = '1'
        ORDER BY
                page DESC
        ) v
GROUP BY
        v.session
Run Code Online (Sandbox Code Playgroud)

我正在跟踪不同页面的视图,我想知道每个会话的最高页面,以便知道他们在任何给定的时间点击了多远(他们需要一直查看每个页面)会话.

基本上我要做的是在GROUP之前对结果进行排序.以上实现了这一点,成本很高.

任何人都可以拍我的头脑怎么做?多谢你们!

更新:

解释:

"1" "PRIMARY"   "<derived2>"    "ALL"   \N  \N  \N  \N  "3545"  "Using temporary; Using filesort"

"2" "DERIVED"   "views" "index" \N  "page"  "5" \N  "196168"    "Using where"
Run Code Online (Sandbox Code Playgroud)

架构:

ID       int(8) unsigned  (NULL)     NO      PRI     (NULL)   auto_increment  select,insert,update,references         
page     int(8)           (NULL)     YES     MUL     (NULL)                   select,insert,update,references         
user_id  int(8)           (NULL)     YES             (NULL)                   select,insert,update,references         
session  int(8)           (NULL)     YES             (NULL) …
Run Code Online (Sandbox Code Playgroud)

mysql sql optimization

4
推荐指数
1
解决办法
5174
查看次数