MYSQL:如何用前面的条目填充列中的空值?
我在工作中有一个程序,可以导出到CSV,但在最烦人的地方留下空白。我想在同一行上查看承运人和目的地,目前承运人位于目的地上方1行,如下所示: 我有一个如下所示的数据库: |钥匙|载体| |目的地| |-------------| |1 | HULL2 | || |2 | | C14A102| |3 | DONC1 | || |4 | | | D15A012| 我想要的是: 或者插入一个新列,其中包含来自carrier列的信息 抱歉,如果这让人困惑,我很难解释MYSQL:如何用前面的条目填充列中的空值?,mysql,Mysql,我在工作中有一个程序,可以导出到CSV,但在最烦人的地方留下空白。我想在同一行上查看承运人和目的地,目前承运人位于目的地上方1行,如下所示: 我有一个如下所示的数据库: |钥匙|载体| |目的地| |-------------| |1 | HULL2 | || |2 | | C14A102| |3 | DONC1 | || |4 | | | D15A012| 我想要的是: 或者插入一个新列,其中包含来自carrier列的信息 抱歉,如果这让人困惑,我很难解释 James假设列“key”可以通过这
James假设列“key”可以通过这种方式信任,我将使用自联接进行更新,其中联接使用key=key+1,然后确保它只影响偶数行
UPDATE tablename as even_row JOIN tablename as odd_row
ON even_row.Key = odd_row.Key + 1
SET even_row.Carrier = odd_row.Carrier
WHERE odd_row.Key % 2;
下面是一个解决方案,方法是克隆另一个表,然后将其删除:
CREATE TABLE t1(Key_id INT PRIMARY KEY, Carrier CHAR(20), Destination CHAR(20));
INSERT INTO t1 VALUES(1, 'HULL2', ''),(2,'','C14A102'),(3,'DONC1',''),(4,'','D15A012');
CREATE TABLE t2 LIKE t1;
INSERT INTO t2 SELECT * FROM t1;
SELECT * FROM t1;
UPDATE t1 SET Carrier =
(
SELECT t2.Carrier
FROM t2
WHERE t2.Key_id < t1.Key_id AND t2.Carrier != ''
ORDER BY t2.Key_id DESC
LIMIT 1
)
WHERE Carrier = '';
SELECT * FROM t1;
DROP TABLE t2;
输出:
mysql> SELECT * FROM t1;
+--------+---------+-------------+
| Key_id | Carrier | Destination |
+--------+---------+-------------+
| 1 | HULL2 | |
| 2 | | C14A102 |
| 3 | DONC1 | |
| 4 | | D15A012 |
+--------+---------+-------------+
4 rows in set (0.00 sec)
mysql> UPDATE t1 SET Carrier =
-> (
-> SELECT t2.Carrier
-> FROM t2
-> WHERE t2.Key_id < t1.Key_id AND t2.Carrier != ''
-> ORDER BY t2.Key_id DESC
-> LIMIT 1
-> )
-> WHERE Carrier = '';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> SELECT * FROM t1;
+--------+---------+-------------+
| Key_id | Carrier | Destination |
+--------+---------+-------------+
| 1 | HULL2 | |
| 2 | HULL2 | C14A102 |
| 3 | DONC1 | |
| 4 | DONC1 | D15A012 |
+--------+---------+-------------+
4 rows in set (0.00 sec)
解释它让我很困惑。。。你说出了我的话。你能给我们看一下预期的输出吗?对不起,蒂姆,我现在正试图修复!!你需要有一些字段来获得下一行。修复了帖子抱歉新帖子:谢谢你的回复,我在“where子句”中获得1054-未知列“cur_row.id”。我已经编辑了我的答案以使用你的列名,但我必须依靠你来了解我试图提出的建议,并根据您的情况进行适当调整。如果我的表中有1000多条不同运营商名称的线路,这会起作用吗?为什么不?只需用您自己的表名替换“t1”。你可以试一试@詹姆斯
mysql> SELECT * FROM t1;
+--------+---------+-------------+
| Key_id | Carrier | Destination |
+--------+---------+-------------+
| 1 | HULL2 | |
| 2 | | C14A102 |
| 3 | DONC1 | |
| 4 | | D15A012 |
+--------+---------+-------------+
4 rows in set (0.00 sec)
mysql> UPDATE t1 SET Carrier =
-> (
-> SELECT t2.Carrier
-> FROM t2
-> WHERE t2.Key_id < t1.Key_id AND t2.Carrier != ''
-> ORDER BY t2.Key_id DESC
-> LIMIT 1
-> )
-> WHERE Carrier = '';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2 Changed: 2 Warnings: 0
mysql> SELECT * FROM t1;
+--------+---------+-------------+
| Key_id | Carrier | Destination |
+--------+---------+-------------+
| 1 | HULL2 | |
| 2 | HULL2 | C14A102 |
| 3 | DONC1 | |
| 4 | DONC1 | D15A012 |
+--------+---------+-------------+
4 rows in set (0.00 sec)