【问题标题】:How to merge rows without null fields如何合并没有空字段的行
【发布时间】:2021-08-22 06:06:48
【问题描述】:

我还在学习 MySQL,我有这张表...

staff_id Name Monday Tuesday
1 Mark 8:00am-5:00pm 9:00am-6:00pm
2 Steve 9:00am-6:00pm 7:00am-4:00pm

我已经设法使用下面的脚本将新行拆分并插入到同一个表中。

INSERT INTO table (staff_id,Name,Monday)
(SELECT staff_id, Name, "8:00am-1:00pm"
        FROM table
        WHERE Monday= "8:00am-5:00pm");

INSERT INTO table (staff_id,Name,Monday)
(SELECT staff_id, Name, "2:00pm-5:00pm"
        FROM table
        WHERE Monday= "8:00am-5:00pm");
...etc...

它有效,但我最终得到了太多行(我正在处理数千行)。
有没有一种方法可以让我只使用 MySQL 脚本来获得如下表格?

staff_id Name Monday Tuesday
1 Mark 8:00am-1:00pm 9:00am-2:00pm
1 Mark 2:00pm-5:00pm 3:00pm-6:00pm
2 Steve 9:00am-2:00pm 7:00am-12:00pm
2 Steve 3:00pm-6:00pm 1:00pm-4:00pm

其他解决方案建议使用聚合函数 (MAX),不幸的是,这在我的情况下不起作用,我不知道如何为此目的正确使用“JOIN”。
任何帮助将不胜感激。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    你必须使用 UPDATE 而不是 INSERT INTO

    CREATE TABLE mytable
        (`staff_id` int, `Name` varchar(5), `Monday` varchar(13), `Tuesday` varchar(13))
    ;
        
    INSERT INTO mytable
        (`staff_id`, `Name`, `Monday`, `Tuesday`)
    VALUES
        (1, 'Mark', '8:00am-5:00pm', '9:00am-6:00pm'),
        (2, 'Steve', '9:00am-6:00pm', '7:00am-4:00pm')
    ;
    
    UPDATe mytable SET Monday = "8:00am-1:00pm"
    
            WHERE Monday= "8:00am-5:00pm";
    
    UPDATe mytable SET Monday = "8:00am-1:00pm"
    
            WHERE Monday= "9:00am-6:00pm";
    
    SELECT * FROM mytable
    
    员工编号 |姓名 |星期一 |周二 --------: | :---- | :------------ | :------------ 1 |马克 |上午 8:00 至下午 1:00 |上午 9:00 至下午 6:00 2 |史蒂夫 |上午 8:00 至下午 1:00 |上午 7:00 至下午 4:00

    db小提琴here

    【讨论】:

    • 感谢您的建议。它没有完全解决问题,因为它没有添加从初始行拆分的第二行。但至少你给我指出了正确的方向。我不得不再次插入原始行并使用要在第二行中更新的新值运行脚本。我会接受你的回答。
    • 你的设计让我有点困惑。因为如果发现很难相信,您想为所有员工插入一个新行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2021-09-19
    • 1970-01-01
    • 2011-05-03
    • 2012-04-04
    相关资源
    最近更新 更多