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,这使事情更加清楚。我想我要做的是使用这个想法,但我可能会使用两个表选项。谢谢!