Mysql 我可以合并按分组的最新和最旧行中的数据吗?

Mysql 我可以合并按分组的最新和最旧行中的数据吗?,mysql,time,merge,group-by,greatest-n-per-group,Mysql,Time,Merge,Group By,Greatest N Per Group,我想以某种方式合并这些MySQL 5.6结果。其思想是从每个id的最新和最旧行获取数据。配对时间/id值是唯一的 表为: 代码为: 结果是: SQL Fiddle: 如何合并这两个选择以从最早和最新的行中获取数据?最好省略最早和最新的行,它们与id 5相同,如peach 期望输出: 我不明白怎么能做到这一点。我尝试了一些结果不正确的事情。这里有人知道怎么做吗?你就快到了。现在,您有两个查询返回所需的信息。你只需要把他们连在一起 SELECT a.latest as time,a.id,a.tit

我想以某种方式合并这些MySQL 5.6结果。其思想是从每个id的最新和最旧行获取数据。配对时间/id值是唯一的

表为:

代码为:

结果是:

SQL Fiddle:

如何合并这两个选择以从最早和最新的行中获取数据?最好省略最早和最新的行,它们与id 5相同,如peach

期望输出:


我不明白怎么能做到这一点。我尝试了一些结果不正确的事情。这里有人知道怎么做吗?

你就快到了。现在,您有两个查询返回所需的信息。你只需要把他们连在一起

SELECT a.latest as time,a.id,a.titulo,a.precio,a.vendidos,b.oldest as oldest_time, b.precio as oldest_precio, b.vendidos as oldest_vendidos
FROM (
    SELECT id, MAX(time) AS latest, title, precious, vendidos
    FROM srapedpubs t 
    GROUP BY id
) a
INNER JOIN (
    SELECT id, MAX(time) AS oldest, title, precious, vendidos
    FROM srapedpubs
    GROUP BY id
) b
ON b.id=a.id
WHERE b.oldest <> a.latest
ORDER BY id ASC;

你快到了。现在,您有两个查询返回所需的信息。你只需要把他们连在一起

SELECT a.latest as time,a.id,a.titulo,a.precio,a.vendidos,b.oldest as oldest_time, b.precio as oldest_precio, b.vendidos as oldest_vendidos
FROM (
    SELECT id, MAX(time) AS latest, title, precious, vendidos
    FROM srapedpubs t 
    GROUP BY id
) a
INNER JOIN (
    SELECT id, MAX(time) AS oldest, title, precious, vendidos
    FROM srapedpubs
    GROUP BY id
) b
ON b.id=a.id
WHERE b.oldest <> a.latest
ORDER BY id ASC;

这是否是您的解决方案:

select * from (
SELECT b.*
FROM (SELECT t.id, MAX(time) AS latest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.latest
ORDER BY id ASC) one_t 
left join 
(SELECT b.*
FROM (SELECT t.id, MIN(time) AS oldest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.oldest
ORDER BY id ASC) two_t 
on one_t.id = two_t.id
where one_t.vendidos <> two_t.vendidos
所以结果和你的问题一样:

select one_t.time
      , one_t.id
      , one_t.titulo
      , one_t.precio
      , one_t.vendidos
      , two_t.time as oldest_time
      , two_t.precio as oldest_precio 
      , two_t.vendidos as oldest_vendidos  from (
SELECT b.*
FROM (SELECT t.id, MAX(time) AS latest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.latest
ORDER BY id ASC) one_t 
left join 
(SELECT b.*
FROM (SELECT t.id, MIN(time) AS oldest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.oldest
ORDER BY id ASC) two_t 
on one_t.id = two_t.id
where one_t.vendidos <> two_t.vendidos

这是否是您的解决方案:

select * from (
SELECT b.*
FROM (SELECT t.id, MAX(time) AS latest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.latest
ORDER BY id ASC) one_t 
left join 
(SELECT b.*
FROM (SELECT t.id, MIN(time) AS oldest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.oldest
ORDER BY id ASC) two_t 
on one_t.id = two_t.id
where one_t.vendidos <> two_t.vendidos
所以结果和你的问题一样:

select one_t.time
      , one_t.id
      , one_t.titulo
      , one_t.precio
      , one_t.vendidos
      , two_t.time as oldest_time
      , two_t.precio as oldest_precio 
      , two_t.vendidos as oldest_vendidos  from (
SELECT b.*
FROM (SELECT t.id, MAX(time) AS latest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.latest
ORDER BY id ASC) one_t 
left join 
(SELECT b.*
FROM (SELECT t.id, MIN(time) AS oldest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.oldest
ORDER BY id ASC) two_t 
on one_t.id = two_t.id
where one_t.vendidos <> two_t.vendidos

杰出的你真快!非常感谢你!杰出的你真快!非常感谢你!谢谢你的快速回复。通过union,我可以获得不同行中的数据。我需要和问题中的期望输出一样的答案。我已经更新了我的答案,使用联合不是正确的解决方案,我在看到同一行记录要求之前发布了答案。谢谢你的快速回复。通过union,我可以获得不同行中的数据。我已经更新了我的答案,使用JOIN-UNION不是正确的解决方案,我在看到同一行的记录要求之前发布了答案
select one_t.time
      , one_t.id
      , one_t.titulo
      , one_t.precio
      , one_t.vendidos
      , two_t.time as oldest_time
      , two_t.precio as oldest_precio 
      , two_t.vendidos as oldest_vendidos  from (
SELECT b.*
FROM (SELECT t.id, MAX(time) AS latest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.latest
ORDER BY id ASC) one_t 
left join 
(SELECT b.*
FROM (SELECT t.id, MIN(time) AS oldest
    FROM srapedpubs t GROUP BY id) a
INNER JOIN srapedpubs b ON b.id = a.id AND b.time = a.oldest
ORDER BY id ASC) two_t 
on one_t.id = two_t.id
where one_t.vendidos <> two_t.vendidos