Php 如何从一个表中展开逗号分隔的字段,并将其复制到使用相同唯一id的第二个表中的多个字段中
表1中有一个名为subjects的字段,该字段用逗号分隔,每个项目都有一个唯一的idPhp 如何从一个表中展开逗号分隔的字段,并将其复制到使用相同唯一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个字段
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行,以便我可以测试它并确保它有效?您的问题现在解决了吗?你对这个答案还有疑问吗?若要接受答案“”,请参阅