Php 如何从一个表中展开逗号分隔的字段,并将其复制到使用相同唯一id的第二个表中的多个字段中

Php 如何从一个表中展开逗号分隔的字段,并将其复制到使用相同唯一id的第二个表中的多个字段中,php,mysql,substring,Php,Mysql,Substring,表1中有一个名为subjects的字段,该字段用逗号分隔,每个项目都有一个唯一的id id1's subjects field contains this information: apple, banana, tomato, melon id2's subjects field contains this information: pineapple,seed,jelly,fish,eel 有些字段只包含一个主题,有些字段最多包含8个主题,所有字段之间用逗号分隔 我有表2,其中包含8个字段

表1中有一个名为subjects的字段,该字段用逗号分隔,每个项目都有一个唯一的id

id1's subjects field contains this information: apple, banana, tomato, melon

id2's subjects field contains this information: pineapple,seed,jelly,fish,eel
有些字段只包含一个主题,有些字段最多包含8个主题,所有字段之间用逗号分隔

我有表2,其中包含8个字段,分别称为cat1、cat2、cat3、cat4、cat5、cat6、cat7、cat8

我试图使用下面的SQL语句复制表1中的subjects字段,用逗号将其分隔,并将其输入到表2中的8个可能的cat字段中,但我一直收到以下错误消息:“找到了一条新语句,但在它和上一条语句之间没有分隔符。(在68位置的“SELECT”附近) . 请协助更正我的代码

更新表2值(cat1、cat2、cat3、cat4、cat5、cat6、cat7、cat8) 选择子字符串_索引(主题“,”,1)作为cat1, 子串索引(子串索引(受试者,,,,,,,,,-1)为cat2, 子串索引(子串索引(受试者,,,,,,,,,-1)作为cat3, 子串索引(子串索引(受试者,,,,,,,,,-1)如cat4, 子串索引(子串索引(受试者,,,,,,,,,-1)为cat5, 子串索引(子串索引(受试者,,,,,,,,,-1)为cat6, 子串索引(子串索引(受试者,,,,,,,,,-1)为cat7, 子串_索引(子串_索引(受试者,,,,,,,,,-1),如第8类 表1,其中id=表1.id


谢谢

如果存在表2,并且需要从表1中匹配数据,则它是您需要的更新查询

UPDATE table2 t2 JOIN table1 t1 ON t2.id = t1.id
SET 
  t2.cat1=SUBSTRING_INDEX(t1.subjects,',',1) 
, t2.cat2=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',2),',',-1)
, t2.cat3=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',3),',',-1)
, t2.cat4=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',4),',',-1)
, t2.cat5=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',5),',',-1)
, t2.cat6=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',6),',',-1)
, t2.cat7=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',7),',',-1)
, t2.cat8=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',8),',',-1)
如果表2中没有数据,那么在MySQL中,“insert-into”不能为您创建表,您需要创建表,然后将其插入

CREATE TABLE Table2
    (id int,cat1 varchar(20), cat2 varchar(20), cat3 varchar(20), cat4 varchar(20), cat5 varchar(20), cat6 varchar(20), cat7 varchar(20), cat8 varchar(20))
;

INSERT INTO table2 (cat1,cat2,cat3,cat4,cat5,cat6,cat7,cat8) 
SELECT id
    , SUBSTRING_INDEX(subjects,',',1) AS cat1
    , SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',',2),',',-1) AS cat2
    , SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',',3),',',-1) AS cat3
    , SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',',4),',',-1) AS cat4
    , SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',',5),',',-1) AS cat5
    , SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',',6),',',-1) AS cat6
    , SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',',7),',',-1) AS cat7
    , SUBSTRING_INDEX(SUBSTRING_INDEX(subjects,',',8),',',-1) AS cat8 
FROM table1

这是正确的解决方案:

UPDATE table2 t2 JOIN table1 t1 ON t2.id = t1.id
SET 
  t2.cat1=SUBSTRING_INDEX(t1.subjects,',',1) 
, t2.cat2=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',2),',',-1)
, t2.cat3=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',3),',',-1)
, t2.cat4=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',4),',',-1)
, t2.cat5=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',5),',',-1)
, t2.cat6=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',6),',',-1)
, t2.cat7=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',7),',',-1)
, t2.cat8=SUBSTRING_INDEX(SUBSTRING_INDEX(t1.subjects,',',8),',',-1)
问题是,如果subject8为空,则此联接将复制subject7并将其重新输入subject8,从而产生大量重复的主题。有些项目只有一个主题,有些项目多达8个主题


另外,是否有一种方法可以将连接限制为10行,以便在1800万行上运行连接之前对其进行测试并确保其工作正常?

欢迎使用Stack Overflow。它不起作用不是对你的问题的有用描述。请您的问题提供有关错误的更多信息。如果您去掉查询的
插入
部分,只留下
选择
,您会得到什么结果?非常简单。没有逗号分隔的字段,或者不用麻烦使用RDBMS。表2中是否有数据,是否需要更新?还是你只是第一次插入?如果你看我的(顺便说一句,它确实有效)没有眼睛,表2中有数据。表1和表2使用相同的唯一标识符,但它们的字段不同,正如我上面所解释的。您的第一个解决方案似乎是正确的:更新表2 t2连接表1 t1 ON t2.id=t1.id。但是,我的表有1800万行。是否有一种方法可以将连接限制为10行,以便我可以测试它并确保它有效?您的问题现在解决了吗?你对这个答案还有疑问吗?若要接受答案“”,请参阅