从表中选择条件数据并INSERT INTO另一个

时间:2016-02-18 09:48:56

标签: php mysql

我有2个表AB

A有五列ids1s2s3s4ID列是唯一的,而其他列的值为0或1。

表B有2个空列ids_name

每次表s*A列的值为1时,我想插入该列的名称(例如 s4)和{{ 1}}分别在表id的列Bs_name中对其进行反对。

我如何在PHP中执行此操作? 我试图尽可能清楚。非常感谢!

2 个答案:

答案 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来做这件事;它将在数据库上运行一次。如果您尝试同时保留数据的AB表示,那么您很可能做错了 - 除非您已经证明缓存两种表单对性能都是必要的。请注意,将相同数据存储在数据库中的两个不同位置将导致维护噩梦;如果您必须同时保留两者,请确保只有一个表单可以编辑,并从中更新其他缓存表单。

答案 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