【问题标题】:MySQL - Insert changes from one table to anotherMySQL - 将更改从一个表插入到另一个表
【发布时间】:2012-05-01 03:39:13
【问题描述】:

我有一个简化的表格:

id     date     color
----------------------
1   2012-01-01  black
2   2012-01-02  red
3   2012-01-03  red
4   2012-01-04  red
5   2012-01-05  green

现在我需要将此表中的颜色更改插入到新表中:

   date     before   now
----------------------------
2012-01-02  black    red
2012-01-04  red      green      

谁能告诉我怎么做?

【问题讨论】:

  • 这是作业吗?如果是,则应将其标记为此类。另外,到目前为止,您尝试了哪些方法,但效果如何?
  • 输出的日期不明确,指的是哪个日期?

标签: mysql sql select join insert


【解决方案1】:

比较第二行和上一行:

SELECT cur.date, prev.color "before", cur.color now
FROM tbl cur
LEFT JOIN tbl prev ON cur.id = prev.id + 1
WHERE cur.id > 1 -- start detecting changes from second row
     AND prev.color <> cur.color

现场测试:http://sqlfiddle.com/#!2/0c146/1

编辑

即使在非连续数据中也有效。如果 MySQL 中有 CTE 功能,查询会更简洁

create table tbl
(
  id int, 
  date date,
  color text
);


insert into tbl(id,date,color)
select 1,'2012-1-1','black' union
select 2,'2012-1-3','red' union
select 3,'2012-1-7','red' union
select 4,'2012-1-15','red' union
select 5,'2012-1-21','green' ;


set @rx = 0;
set @ry = 0;


select cur.date, prev.color as "before", cur.color as "now"

from (select *, @ry := @ry + 1 as series from tbl order by date) as cur 
left join (select *, @rx := @rx + 1 as series from tbl order by date) as prev
on cur.series = prev.series + 1

where cur.series > 1
and prev.color <> cur.color

现场测试:http://sqlfiddle.com/#!2/b9443/2

【讨论】:

  • 哦,但是如果 id=4 的行不存在,您的代码将不再工作
  • 如果 MySQL 支持 CTE,我有一个现成的答案。 Postgresql、Oracle、SQL Server 都可以。我将检查如何在 MySQL 中模拟一个
  • 我修改了答案,即使 id 不连续,代码仍然可以工作。检查编辑
  • 非常好。非常感谢
【解决方案2】:

首先,重命名 color 列 -> before,然后添加 now 列(如果可能,default null),然后根据需要更新 now 列。

【讨论】:

    【解决方案3】:

    如果我没听错的话,存储过程就是你所需要的。

    Stored Procedures

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 2013-08-15
      • 2013-04-25
      • 2012-12-05
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多