我有一张桌子:
ITEM NOTE RECORD_DATE USER
Apple Blah 2016-12-30 11:22:33 mcmurphy510
Orange Somenote 2016-12-31 11:22:33 user2
Apple BlahBlah 2017-01-01 11:22:33 user2
我正在尝试创建一个查询,该查询将显示项目和最近的便笺。我还需要从日期和用户列中提取四个字段:
CREATED
:应该是给定RECORD_DATE
的最早行的时间戳ITEM
:应该是给定CREATED_BY
的最早行的USER
ITEM
:应该是给定UPDATED
的最新行的时间戳RECORD_DATE
:应该是给定ITEM
的最新行的UPDATED_BY
我使用以下查询成功地获取了一个或另一个(最早的或最新的),但没有同时获得这两个:
SELECT
i.item,
i.note,
i.record_date AS created,
i.user AS created_by
FROM
item i
INNER JOIN (
SELECT
item,
MAX(record_date) as record_date
FROM item
GROUP BY item
) i2
ON (
i.item = i2.item AND
i.record_date = i2.record_date
)
使用这个,我可以通过在子查询中的
USER
和ITEM
之间切换,在返回最早和最新的RECORD_DATE
之间切换。我的问题是如何创建一个signle查询,它可以在同一行中同时显示最早和最新的结果?
预期结果:
ITEM NOTE CREATED CREATED_BY UPDATED UPDATED_BY
Apple BlahBlah 2016-12-30 11:22:33 mcmurphy510 2017-01-01 11:22:33 user2
Orange Somenote 2016-12-31 11:22:33 user2 NULL NULL
我这里有一把小提琴:
http://sqlfiddle.com/#!9/cd724a/3
最佳答案
您可以找到每个项目的最早和最晚日期,然后与主表连接,如下所示:
select
i1.item,
i2.note,
i1.record_date created_date,
i1.user create_user,
case when i1.record_date <> i2.record_date then i2.record_date end update_date,
case when i1.record_date <> i2.record_date then i2.user end update_user
from item i1
inner join item i2
on i1.item = i2.item
inner join (
select item, min(record_date) mn, max(record_date) mx
from item
group by item
) i3 on i1.item = i3.item
and i1.record_date = i3.mn
and i2.record_date = i3.mx;
SQLFiddle
关于mysql - 按列分组,返回最近的AND最早的字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41597858/