我有一个包含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
我的查询是什么来获得所需的输出?
任何帮助和想法都将受到赞赏。
答案 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