2016-02-18 161 views
-1

我有2個表AB從表中選擇條件數據並插入另一個

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

表B具有2分空列ids_name

每次​​列在表A的值是1,我想在表B的列分別s_nameid插入該列的名稱(例如s4)和id反對。

我該如何在PHP中做到這一點? 我試圖儘可能清楚。非常感謝!

+1

嗯,發表您的嘗試至今。你什麼意思是「每次」?你在尋找SQL觸發器嗎? – Noy

+0

我不知道像觸發器這樣的技術術語。我每次意味着B列中的id都可以重複。 – zedd

回答

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 
+0

它的工作!感謝Firas Rassas。對不起,我不得不把我的時間。 – zedd

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表示,則很有可能會出錯 - 除非您已證明緩存兩種表單對於性能都是必需的。請注意,將相同的數據存儲在數據庫的兩個不同位置會導致維護噩夢;如果您必須同時保留兩者,請確保只有一個表單以任何方式可編輯,並從中更新其他緩存表單。

相關問題