SQL表:如何将整个列向上移动,同时保留其他列

时间:2017-05-14 16:37:37

标签: php mysql database

假设我有以下样本表:

col1      col2      col3
-------------------------
7         12        0
3         34        0.01
9         62        0.5
2         88        1.1
8         20        2.4
1         18        2.8

我试图从col2和col3中删除行,其中col3中的值低于某个值,并将剩余值向上移动到这些列中,同时保留col1。例如,如果我将col3最小值设置为0.5,我的新表应如下所示:

col1      col2      col3
-------------------------
7         62        0.5
3         88        1.1
9         20        2.4
2         18        2.8

请注意,col1中的值不是顺序的,并且保持相同的顺序,但是表已经被删除的行数缩短了。

到目前为止我找到的解决方案似乎都基于col1中的值是顺序的。例如something like this。我也查看了here提供的示例,但它似乎并不是我想要做的,但我可能是错的。

不要试图让任何人为我这样做,只是想获得一些指导和建议。即使只是某些与适当资源的链接,我也会非常感激。

谢谢!

2 个答案:

答案 0 :(得分:2)

无间隙的自动递增ID会使问题变得相当简单。带有间隙的升序ID 也会起作用,但它增加了一层复杂性......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,col1 INT NOT NULL
,col2 INT NOT NULL
,col3 DECIMAL(5,2) NOT NULL
);

INSERT INTO my_table VALUES
(1,7,12,0),
(2,3,34,0.01),
(3,9,62,0.5),
(4,2,88,1.1),
(5,8,20,2.4),
(6,1,18,2.8);

SELECT b.id
     , b.col1
     , a.col2
     , a.col3
  FROM 
     ( SELECT @i:=@i+1 i
            , col2
            , col3 
         FROM my_table
            , (SELECT @i:=0) vars 
        WHERE col3 >= 0.5 
        ORDER 
           BY id
     ) a
  JOIN my_table b
    ON b.id = a.i;
+----+------+------+------+
| id | col1 | col2 | col3 |
+----+------+------+------+
|  1 |    7 |   62 | 0.50 |
|  2 |    3 |   88 | 1.10 |
|  3 |    9 |   20 | 2.40 |
|  4 |    2 |   18 | 2.80 |
+----+------+------+------+

答案 1 :(得分:0)

好的,感谢来自@Strawberry和@Ankit Bajpai的一些有用的输入/讨论/评论我决定使用稍微粗略的2表方法来做到这一点。我意识到这可能不是解决这个问题的最有效方法,但这很快,很简单,并且让事情按照我的要求完成。

以下是我在痛苦细节中所做的细分:

首先,我给我的原始表一个主要的自动递增id列(我本来应该首先做的):

ALTER TABLE table1 ADD id INT PRIMARY KEY AUTO_INCREMENT;

这改变了我原来的表结构:

col1      col2      col3      id
--------------------------------
7         12        0         1
3         34        0.01      2
9         62        0.5       3
2         88        1.1       4
8         20        2.4       5
1         18        2.8       6

然后,在创建了一个与table1具有相同表结构的另一个表(table2)之后,我在table2中填充了我想要保存的数据,如下所示:

INSERT INTO table2 (col1, col2, col3)
  SELECT col1, col2, col3 FROM table1 WHERE col3 >= 0.5

这在表2中给出了以下结果:

col1      col2      col3      id
--------------------------------
9         62        0.5       1
2         88        1.1       2
8         20        2.4       3
1         18        2.8       4

然后,为了完成这些工作,我使用我的新id作为条件更新了table2中的col1和table1中col1的值:

UPDATE table2
  SET table2.col1 = table1.col1
  WHERE table2.id=table1.id

这正是我在table2中所需要的:

col1      col2      col3      id
--------------------------------
7         62        0.5       1
3         88        1.1       2
9         20        2.4       3
2         18        2.8       4

再一次,我意识到这可能不是解决这个问题的最有效方法,但这很快,很简单,并且让事情按照我的要求完成。