我有一张桌子:

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
        )

使用这个,我可以通过在子查询中的USERITEM之间切换,在返回最早和最新的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/

10-13 09:54