gpt4 book ai didi

mysql - 在mysql中分组和排序

转载 作者:可可西里 更新时间:2023-11-01 08:33:44 30 4
gpt4 key购买 nike

我有一个包含 4 个字段和 3 个记录的表,查询工作正常,但我想在分组依据

之前按 a.start_date 排序
Tabel Name : testdata
Table fields : data type
id: autoincrement,primary key
pattern : varchar
start_date : datetime
cost : decimal(10,5)

记录:

ID | Pattern | Start_date | Cost
1 | 1 | 2013-09-15 | 10.00
2 | 1 | 2013-09-04 | 15.00
3 | 1 | 2013-09-21 | 28.00

查询:

select a.*, b.cost AS future_cost, b.start_date AS future_date
FROM testdata a
LEFT JOIN testdata b ON a.pattern = b.pattern AND a.id <> b.id
GROUP BY a.pattern

当前输出:

id  | pattern | start_date | cost | future_date | future_cost
1 | 1 | 2013-09-15 | 10.00| 2013-09-04 | 15.00

要求的输出:

id  | pattern | start_date | cost | future_date | future_cost
2 | 1 | 2013-09-04 | 15.00| 2013-09-15 | 10.00

我需要的是,在上面的例子中最早的日期是 2013-09-04 所以 future 的日期将是 15,如果我删除 2013 的记录-09-04 那么开始日期应该是 2013-09-15 future 的日期应该是 2013-09-21

要获得所需的输出,我的查询是什么?

任何帮助和想法将不胜感激。

最佳答案

你得到 1 行而不是 6 行的原因是你滥用了 mysql 独特的宽松分组语法(我不会详细说明,但你没有按所有非聚合列分组 - 通常是语法错误)。

基本上您想要连接最早的 2 行,并且您可以根据自己的意愿调整该独特功能:

select a.*, b.cost AS future_cost, b.start_date AS future_date
from (select * from (select * from testdata order by start_date) x group by pattern) a
left join (select * from testdata order by start_date) b
on a.pattern = b.pattern and a.id != b.id
group by a.pattern

参见 SQLFiddle

这里发生的事情是,当使用分组依据而不按所有非聚合列分组时,mysql 返回遇到的(第一)行,并通过从有序行集中选择,您可以控制是哪一行。

关于mysql - 在mysql中分组和排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18984229/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com