从一个表中选择条件数据并插入到另一个表中


SELECT conditional data from a table and INSERT INTO another

我有 2 个表AB .

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

表 B 有 2 个空列 ids_name

每次表 As*列的值为 1 时,我想插入该列的名称(例如 s4 ),并在表 B 的列中分别s_nameidid它。

如何在 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来做到这一点;它将在数据库上运行一次。如果您试图同时保留数据的AB表示形式,则很可能做错了什么 - 除非您已经证明缓存这两种形式对于性能是必要的。请注意,将相同的数据存储在数据库内的两个不同位置将导致维护噩梦;如果您必须同时保留两者,请确保只有一个表单以任何方式可编辑,并从中更新另一个缓存的表单。

如果总是只有一列的值为"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