Php SQL表:如何将整个列上移,而不影响其他列

Php SQL表:如何将整个列上移,而不影响其他列,php,mysql,database,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      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
INSERT INTO table2 (col1, col2, col3)
  SELECT col1, col2, col3 FROM table1 WHERE col3 >= 0.5
请注意,col1中的值不是顺序的,并且保持相同的顺序,但表已因删除的行数而变短

到目前为止,我找到的解决方案似乎都是基于col1中的值是连续的。例如我也看过提供的例子,但它似乎不是我想要做的,但我可能是错的

不是想让任何人帮我做这件事,只是想得到一些指导和建议。即使只是一些适当资源的链接,我也非常感激


谢谢

没有间隙的自动递增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 |
+----+------+------+------+

好的,多亏了@草莓和@Ankit Bajpai的一些有用的输入/讨论/评论,我决定使用一种稍微粗糙的2表方法来完成这项工作。我意识到这可能不是最有效的方法,但这很快,很容易,让事情完全按照我希望的那样进行

以下是我所做工作的详细分解:

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

这将我原来的表结构更改为:

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
然后,在创建了另一个表(表2)并具有与表1相同的表结构之后,我用我想从表1中保留的数据填充了表2,如下所示:

col1      col2      col3
-------------------------
7         62        0.5
3         88        1.1
9         20        2.4
2         18        2.8
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
col1      col2      col3      id
--------------------------------
7         62        0.5       1
3         88        1.1       2
9         20        2.4       3
2         18        2.8       4
然后,为了完成这些工作,我使用新id作为条件,使用表1中col1中的值更新了表2中的col1:

UPDATE table2
  SET table2.col1 = table1.col1
  WHERE table2.id=table1.id
这正是我在表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
col1      col2      col3      id
--------------------------------
7         62        0.5       1
3         88        1.1       2
9         20        2.4       3
2         18        2.8       4

我再一次意识到,这可能不是最有效的方法,但这是一种快速、简单的方法,使事情完全按照我的要求进行。

这里没有“上”字:-(您的值是否存储在按排序方式排列的列中???@草莓澄清一下,我的意思是,一旦col2和col3中的前几个值被删除,这两列的其余值将“上移”填补空白。如果标题不清楚,请道歉。@AmitGaud我不确定我是否理解你的问题。你能澄清一下吗?我知道你的意思。我的意思是没有“up”!你认为不创建另一个表,这是可以实现的吗?表?是的。列?否。@Ankit Bajpai-这里的表只是为了复制答案r的解决方案,复制您的模式。作为OP,您不必这样做。唯一的
id
是必要的。我明白您在这里得到了什么。我真的应该包括自动递增的id,这使事情更加清楚。我想我要做的是使用这个想法,但我可能会使用两个表选项。谢谢!