在mysql中按顺序排序

时间:2013-09-24 14:21:28

标签: mysql sql

我有一个包含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

QUERY:

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,因此未来日期将为15,如果我删除2013-09-04的记录,则开始日期应为{{1} }和将来的日期应为2013-09-15

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

任何帮助和想法都将受到赞赏。

2 个答案:

答案 0 :(得分:2)

你得到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

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

答案 1 :(得分:0)

我不知道这是否是你想要的,但我认为你可以制作一个独特的而不是群体。

所以......像:

select a.id,distinct(a.pattern),a.start_date,a.cost, 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
order by a.start_date asc