3

我有一个包含 4 个字段和 3 个记录的表,查询工作正常,但我希望a.start_date在 group by 之前 order by

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未来的日期15,如果我删除记录,2013-09-04那么开始日期应该是2013-09-15,未来的日期应该是2013-09-21

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

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

4

2 回答 2

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 返回遇到的(第一)行,并通过从有序行集中进行选择,您可以控制是哪一行。

于 2013-09-24T15:04:16.257 回答
0

我不完全知道这是否是您想要的,但我认为您可以创建一个 distinct 而不是 group by。

所以…… 喜欢:

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
于 2013-09-24T14:47:02.077 回答