有一个表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)
但这看起来非常低效.还有其他方法可以达到相同的效果吗?
怎么做?
这个问题的前标题是" 在带有子查询的复杂查询中使用等级(@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 …
根据我的研究,这是一个非常普遍的问题,通常有一个相当简单的解决方案.我的任务是改变几个查询,将所有结果变为每组前三名.起初这很顺利,我使用了几个建议和本网站的答案来实现这一目标(观看次数最多的产品).然而,由于多次加入,我的最后一个"畅销产品"遇到了困难.
基本上,我需要按每个产品的最高销售额排序所有产品,其中每个供应商的最大产品数为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) 例如,我有下表:
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进行交叉连接可以正常工作,但我正在寻找一种可扩展的解决方案,可以应用于具有数百万条记录的表.谢谢