相关疑难解决方法(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万
查看次数

检索每个组中的最后一条记录 - MySQL

有一个表messages包含如下所示的数据:

Id   Name   Other_Columns
-------------------------
1    A       A_data_1
2    A       A_data_2
3    A       A_data_3
4    B       B_data_1
5    B       B_data_2
6    C       C_data_1
Run Code Online (Sandbox Code Playgroud)

如果我运行查询select * from messages group by name,我会得到如下结果:

1    A       A_data_1
4    B       B_data_1
6    C       C_data_1
Run Code Online (Sandbox Code Playgroud)

什么查询将返回以下结果?

3    A       A_data_3
5    B       B_data_2
6    C       C_data_1
Run Code Online (Sandbox Code Playgroud)

也就是说,应返回每组中的最后一条记录.

目前,这是我使用的查询:

SELECT
  *
FROM (SELECT
  *
FROM messages
ORDER BY id DESC) AS x
GROUP BY name
Run Code Online (Sandbox Code Playgroud)

但这看起来非常低效.还有其他方法可以达到相同的效果吗?

mysql sql group-by greatest-n-per-group

887
推荐指数
17
解决办法
58万
查看次数

为什么MySQL添加了与SQL标准冲突的功能?

我习惯了Microsoft技术,包括SQL Server.今天我遇到了一个Q&A,其中引用了MySQL文档中的以下段落:

标准SQL会拒绝您的查询,因为您无法在聚合查询中选择不属于GROUP BY子句的非聚合字段.MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列.这意味着前面的查询在MySQL中是合法的.您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能.但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用.服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是 不确定的.

如果它与SQL标准冲突,这个MySQL扩展的原因是什么?

mysql

9
推荐指数
2
解决办法
1517
查看次数

如何使用Eloquent订购分组结果?

我一直试图解决这个问题已经有一段时间了,似乎无法让它发挥作用.我有一张看起来与此类似的表.

表:问题

id  yearly_issue    year    stock   created_at      updated_at      magazine_id 
1   10              2000    1       [timestamp]     [timestamp]     3
2   12              1994    6       [timestamp]     [timestamp]     10
3   36              2007    10      [timestamp]     [timestamp]     102
4   6               2002    7       [timestamp]     [timestamp]     7
5   6               2002    2       [timestamp]     [timestamp]     5
6   12              2003    9       [timestamp]     [timestamp]     10
7   11              2003    12      [timestamp]     [timestamp]     10
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要对它进行排序(简单!)但是,我只想获得每个杂志中的一个(专栏magazine_id).

我现在的Eloquent查询是:

$issues = Issue::where('stock', ($all ? '>=' : '>'), 0)
  ->orderBy('year', 'desc')
  ->orderBy('yearly_issue', 'desc')
  ->take($perpage)
  ->get();
Run Code Online (Sandbox Code Playgroud)

我认为添加groupBy('magazine_id')会有所帮助,但似乎它只是部分帮助我.结果的顺序不正确.所以,我的问题是 - 有什么简单的方法吗? …

laravel eloquent

8
推荐指数
1
解决办法
1万
查看次数

从表中查找最新消息,按用户在 mysql 中分组

我的网站上有一个私人消息表,一段时间以来,我的收件箱和发件箱是分开的。我想合并收件箱/发送箱,只显示来自或来自特定用户的最新消息。

TLDR:我想显示按发送给每个用户或从每个用户发送的分组的最新消息。

表格示例

|  id | fromuser | fromid | touser | toid | message    |  timestamp            |
--------------------------------------------------------------------------------
|  1  | user1    |  1     | user2  |  2   | Hello..    |  2015-01-01 00:00:00  |
|  2  | user1    |  1     | user3  |  3   | okay...    |  2015-01-02 00:00:00  |
|  3  | user3    |  3     | user1  |  1   | not....    |  2015-01-03 00:00:00  |
|  4  | user2    |  2     | user3  |  3   | New....    | …
Run Code Online (Sandbox Code Playgroud)

php mysql messages

5
推荐指数
1
解决办法
287
查看次数

min(列)没有返回其他列的正确数据

以下是我所拥有的

+++++++++++++++++++++++++++
id + myDate       + name
+++++++++++++++++++++++++++
'A'+ '2012-06-05' + 'baz'
'A'+ '2012-06-04' + 'bar'
'B'+ '2012-06-05' + 'foo'
'C'+ '2012-06-05' + 'bla'
'C'+ '2012-06-04' + 'blah'
'C'+ '2012-06-06' + 'bleh'
+++++++++++++++++++++++++++
Run Code Online (Sandbox Code Playgroud)

我正在使用的查询是

SELECT id, min(myDate) as Date, name 
FROM myTable
GROUP BY id;
Run Code Online (Sandbox Code Playgroud)

我得到的输出如下

+++++++++++++++++++++++++++
id + myDate       + name
+++++++++++++++++++++++++++
'A'+ '2012-06-04' + 'baz'
'B'+ '2012-06-05' + 'foo'
'C'+ '2012-06-04' + 'bla'
+++++++++++++++++++++++++++
Run Code Online (Sandbox Code Playgroud)

我的问题是,当查询给我正确的日期时,为什么列的数据name将以baz而不是barname表示日期2012-06-04bar.

演示 …

mysql min

2
推荐指数
1
解决办法
2019
查看次数