相关疑难解决方法(0)

检索每个组中的最后一条记录 - 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万
查看次数

获取每组最高/最小<whatever>的记录

怎么做?

这个问题的前标题是" 在带有子查询的复杂查询中使用等级(@Rank:= @Rank + 1) - 它会起作用吗? "因为我正在寻找使用等级的解决方案,但现在我看到Bill发布的解决方案是好多了.

原始问题:

我正在尝试编写一个查询,该查询将根据定义的顺序从每个组获取最后一条记录:

SET @Rank=0;

select s.*
from (select GroupId, max(Rank) AS MaxRank
      from (select GroupId, @Rank := @Rank + 1 AS Rank 
            from Table
            order by OrderField
            ) as t
      group by GroupId) as t 
  join (
      select *, @Rank := @Rank + 1 AS Rank
      from Table
      order by OrderField
      ) as s 
  on t.GroupId = s.GroupId and t.MaxRank = s.Rank
order by OrderField
Run Code Online (Sandbox Code Playgroud)

表达式@Rank := @Rank + 1 …

mysql subquery rank greatest-n-per-group

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

具有多个表连接的每个组的前N个

根据我的研究,这是一个非常普遍的问题,通常有一个相当简单的解决方案.我的任务是改变几个查询,将所有结果变为每组前三名.起初这很顺利,我使用了几个建议和本网站的答案来实现这一目标(观看次数最多的产品).然而,由于多次加入,我的最后一个"畅销产品"遇到了困难.

基本上,我需要按每个产品的最高销售额排序所有产品,其中每个供应商的最大产品数为3 我已经连接多个表以创建原始查询,并且每次我尝试使用变量生成排名产生无效结果.以下内容应该有助于更好地理解这个问题(为简洁起见,我删除了不必要的字段):

产品表

productid | vendorid | approved | active | deleted
Run Code Online (Sandbox Code Playgroud)

供应商表

vendorid | approved | active | deleted
Run Code Online (Sandbox Code Playgroud)

订单表

orderid | `status` | deleted
Run Code Online (Sandbox Code Playgroud)

订单项目表

orderitemid | orderid | productid | price
Run Code Online (Sandbox Code Playgroud)

现在,我的原始查询获得所有结果如下:

SELECT COUNT(oi.price) AS `NumSales`, 
       p.productid, 
       p.vendorid
FROM products p
INNER JOIN vendors v ON (p.vendorid = v.vendorid)
INNER JOIN orders_items oi ON (p.productid = oi.productid)
INNER JOIN orders o ON (oi.orderid = o.orderid)
WHERE (p.Approved = 1 …
Run Code Online (Sandbox Code Playgroud)

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

7
推荐指数
1
解决办法
2489
查看次数

通过"SELECT"命令选择每组的前两个记录的最佳方法是什么?

例如,我有下表:

id group data
1 1 aaa
2 1 aaa
3 2 aaa
4 2 aaa
5 2 aaa
6 3 aaa
7 3 aaa
8 3 aaa
Run Code Online (Sandbox Code Playgroud)

通过"SELECT"命令选择每组的前两个记录的最佳方法是什么?如果没有好办法,你建议做什么例程?(在PHP中)

(模型结果)

1 1 aaa
2 1 aaa
3 2 aaa
4 2 aaa
6 3 aaa
7 3 aaa
Run Code Online (Sandbox Code Playgroud)

我知道在子查询中通过a.id> = b.id进行交叉连接可以正常工作,但我正在寻找一种可扩展的解决方案,可以应用于具有数百万条记录的表.谢谢

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

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

标签 统计

greatest-n-per-group ×4

mysql ×4

group-by ×3

sql ×3

php ×1

rank ×1

subquery ×1