Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL:如何用前面的条目填充列中的空值?_Mysql - Fatal编程技术网

MYSQL:如何用前面的条目填充列中的空值?

MYSQL:如何用前面的条目填充列中的空值?,mysql,Mysql,我在工作中有一个程序,可以导出到CSV,但在最烦人的地方留下空白。我想在同一行上查看承运人和目的地,目前承运人位于目的地上方1行,如下所示: 我有一个如下所示的数据库: |钥匙|载体| |目的地| |-------------| |1 | HULL2 | || |2 | | C14A102| |3 | DONC1 | || |4 | | | D15A012| 我想要的是: 或者插入一个新列,其中包含来自carrier列的信息 抱歉,如果这让人困惑,我很难解释 James假设列“key”可以通过这

我在工作中有一个程序,可以导出到CSV,但在最烦人的地方留下空白。我想在同一行上查看承运人和目的地,目前承运人位于目的地上方1行,如下所示:

我有一个如下所示的数据库: |钥匙|载体| |目的地| |-------------| |1 | HULL2 | || |2 | | C14A102| |3 | DONC1 | || |4 | | | D15A012|

我想要的是:

或者插入一个新列,其中包含来自carrier列的信息

抱歉,如果这让人困惑,我很难解释


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)