我有 2 个表A
和 B
.
表 A
有五列id
、s1
、s2
、s3
、s4
。 ID
列是唯一的,而其他列的值为 0 或 1。
表 B 有 2 个空列 id
和 s_name
。
每次表 A
中s*
列的值为 1 时,我想插入该列的名称(例如 s4
),并在表 B
的列中分别s_name
和id
中id
它。
如何在 PHP 中做到这一点?我试图尽可能清楚。非常感谢!
这是规范化的一种形式,通常通过对非规范化表形成多个(重复)查询,然后使用 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",则使用以下命令:
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