我有2个表A
和B
。
表A
有五列id
,s1
,s2
,s3
,s4
。
ID
列是唯一的,而其他列的值为0或1。
表B有2个空列id
和s_name
。
每次表s*
中A
列的值为1时,我想插入该列的名称(例如 s4
)和{{ 1}}分别在表id
的列B
和s_name
中对其进行反对。
我如何在PHP中执行此操作? 我试图尽可能清楚。非常感谢!
答案 0 :(得分:1)
这是规范化的一种形式,通常通过对非规范化表格形成多个(重复)查询,然后使用UNION ALL
来组合这些部分来完成。实际上,您可以在单个SQL查询中执行此操作:
insert into B (id, s_id)
select id, 1
from A
where s1 = 1
union all
select id, 2
from A
where s2 = 1
union all
select id, 3
from A
where s3 = 1
union all
select id, 4
from A
where s4 = 1
一般来说,你不需要PHP来做这件事;它将在数据库上运行一次。如果您尝试同时保留数据的A
和B
表示,那么您很可能做错了 - 除非您已经证明缓存两种表单对性能都是必要的。请注意,将相同数据存储在数据库中的两个不同位置将导致维护噩梦;如果您必须同时保留两者,请确保只有一个表单可以编辑,并从中更新其他缓存表单。
答案 1 :(得分:0)
如果总是只有一列值为“1”,那么请使用:
INSERT INTO B (id, s_name) VALUES (select a.id, (CASE
WHEN a.s1=1 THEN 's1'
WHEN a.s2=1 THEN 's2'
WHEN a.s3=1 THEN 's3'
WHEN a.s4=1 THEN 's4'
END) as s_name from A as a
where a.s1=1 or a.s2=1 or a.s3=1 or a.s4=1)
否则使用此:
INSERT INTO B (id, s_name)
SELECT id, 's1'
FROM A
WHERE s1 = 1
union all
SELECT id, 's2'
FROM A
WHERE s2 = 1
union all
SELECT id, 's3'
FROM A
WHERE s3 = 1
union all
SELECT id, 's4'
FROM A
WHERE s4 = 1