Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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_Sql - Fatal编程技术网

将mysql中的一行替换为两行

将mysql中的一行替换为两行,mysql,sql,Mysql,Sql,在mysql中,如何用5行数据替换一行。例如,我有这个表 id | companyId | name | open | close 1 | 1 | mon-fri | 10:00 | 19:00 2 | 1 | sat | 10:00 | 12:00 3 | 1 | sun | 1

在mysql中,如何用5行数据替换一行。例如,我有这个表

 id   |   companyId   |      name       |  open  |  close
 1    |    1          |    mon-fri      |  10:00 |  19:00  
 2    |    1          |      sat        |  10:00 |  12:00 
 3    |    1          |      sun        |  10:00 |  12:00 
 4    |    2          |    mon-fri      |  10:00 |  16:00  
 5    |    2          |      sat        |  10:00 |  13:00 
 6    |    2          |      sun        |  10:00 |  13:00 
我想将mon-fri的名称字段转换为mon、tues、wed、thur、fri

 id   |   companyId   |      name       |  open  |  close
 1    |    1          |    mon     |  10:00 |  19:00  
 2    |    1          |    tues    |  10:00 |  19:00 
 3    |    1          |    wed     |  10:00 |  19:00 
 4    |    1          |    thur    |  10:00 |  19:00   
 5    |    1          |    fri     |  10:00 |  19:00  
 6    |    1          |    sat     |  10:00 |  12:00 
 7    |    1          |    sun     |  10:00 |  12:00 
.
.
.

您不能通过
更新
,但您可以做的是将一系列
插入到。。。选择
使用一些字符串文字,然后选择
删除
,以删除展开的行

/* First insert a row for each mon,tue,wed,thur,fri */
/* Column values are copied from the existing mon-fri row, and use the literal strings 'mon', 'tue', etc as the new `name` */
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'mon', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'tue', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'wed', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'thur', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'fri', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'

/* Then delete the original mon-fri rows which you just expanded out */
DELETE FROM yourtable WHERE `name` = 'mon-fri'

(应得的荣誉:这一极好的建议是作者在未经请求的编辑中提出的)

您还可以通过使用虚拟表来减少语句的数量以及表扫描的数量,如下所示:

/* Cross-join the existing 'mon-fri' rows with a virtual table of day names
   of 'mon' through 'fri' and insert the resulting set back into your table */
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT t.`companyId`, v.`name`, t.`open`, t.`close`
  FROM yourtable t
  CROSS JOIN (
    SELECT 'mon' AS `name` UNION ALL
    SELECT 'tue' UNION ALL
    SELECT 'wed' UNION ALL
    SELECT 'thur' UNION ALL
    SELECT 'fri'
  ) v
  WHERE t.`name` = 'mon-fri';

/* Then delete the original mon-fri rows which you just expanded out */
DELETE FROM yourtable WHERE `name` = 'mon-fri';

评论后更新: 插入行时强制执行它们的顺序没有实际价值,最好在
SELECT
中执行

要按天为每个
公司ID
订购,无论采用哪种方式,都需要做一些工作。您可以使用
%a
调用
LOWER(STR_TO_DATE())
并比较工作日值,但是您还需要将
thur
更改为
thu
,因为MySQL就是这样缩写的。这会导致一系列函数调用

相反,您可以使用
排序依据
中的
CASE…
为每天分配序号值,如:

ORDER BY
 companyId,
 CASE `name`
   WHEN 'sun' THEN 1 
   WHEN 'mon' THEN 2
   WHEN 'tue' THEN 3
   WHEN 'wed' THEN 4
   WHEN 'thur' THEN 5
   WHEN 'fri' THEN 6
   WHEN 'sat' THEN 7
 ELSE 8 END
不过,上述两种方法对索引都不友好。
如果您需要更高的性能,我建议首先不要存储字符串
'mon'、'tue'、'wed'
等,而是存储它们相关的工作日值。有关详细信息,请参阅

您不能通过
更新来执行此操作,但您可以执行的是一系列
插入到。。。选择
使用一些字符串文字,然后选择
删除,以删除展开的行

/* First insert a row for each mon,tue,wed,thur,fri */
/* Column values are copied from the existing mon-fri row, and use the literal strings 'mon', 'tue', etc as the new `name` */
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'mon', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'tue', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'wed', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'thur', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT `companyId`, 'fri', `open`, `close` FROM yourtable WHERE `name` = 'mon-fri'

/* Then delete the original mon-fri rows which you just expanded out */
DELETE FROM yourtable WHERE `name` = 'mon-fri'

(应得的荣誉:这一极好的建议是作者在未经请求的编辑中提出的)

您还可以通过使用虚拟表来减少语句的数量以及表扫描的数量,如下所示:

/* Cross-join the existing 'mon-fri' rows with a virtual table of day names
   of 'mon' through 'fri' and insert the resulting set back into your table */
INSERT INTO yourtable (`companyId`, `name`, `open`, `close`)
  SELECT t.`companyId`, v.`name`, t.`open`, t.`close`
  FROM yourtable t
  CROSS JOIN (
    SELECT 'mon' AS `name` UNION ALL
    SELECT 'tue' UNION ALL
    SELECT 'wed' UNION ALL
    SELECT 'thur' UNION ALL
    SELECT 'fri'
  ) v
  WHERE t.`name` = 'mon-fri';

/* Then delete the original mon-fri rows which you just expanded out */
DELETE FROM yourtable WHERE `name` = 'mon-fri';

评论后更新: 插入行时强制执行它们的顺序没有实际价值,最好在
SELECT
中执行

要按天为每个
公司ID
订购,无论采用哪种方式,都需要做一些工作。您可以使用
%a
调用
LOWER(STR_TO_DATE())
并比较工作日值,但是您还需要将
thur
更改为
thu
,因为MySQL就是这样缩写的。这会导致一系列函数调用

相反,您可以使用
排序依据
中的
CASE…
为每天分配序号值,如:

ORDER BY
 companyId,
 CASE `name`
   WHEN 'sun' THEN 1 
   WHEN 'mon' THEN 2
   WHEN 'tue' THEN 3
   WHEN 'wed' THEN 4
   WHEN 'thur' THEN 5
   WHEN 'fri' THEN 6
   WHEN 'sat' THEN 7
 ELSE 8 END
不过,上述两种方法对索引都不友好。
如果您需要更高的性能,我建议首先不要存储字符串
'mon'、'tue'、'wed'
等,而是存储它们相关的工作日值。有关详细信息,请参阅

有很多……那太好了,但我怎么能像周一、周二、周三、周四、周五、周六、周日那样点餐呢。对所有公司都是这样。@AndriyM超级建议。有很多……那太好了,但我怎么能像周一、周二、周三、周四、周五、周六、周日那样订购呢。所有公司都可以。@AndriyM超级建议。