2012-09-06 18 views
0

我需要您的幫助。如何將單元格中的文本替換爲mysql中另一個表格中的數據

我有一個表在MYSQL這樣

*TABLE1* 
id | permission 
-- | ---------- 
a1 | 1,2,3,4,5 
v2 | 2,3,4 
r1 | 1,3,4,5 
b4 | 
h7 | 4,5 

和我有另一個表

*TABLE2* 
id | permission 
-- | ---------- 
1 | Allow 
2 | Not Allow 
3 | Disabled 
4 | WOW 
5 | Grant 

我想選擇TABLE1 JOIN TABLE2 但是:新表應該是這樣的

*NEW_TABLE* 
id | permission 
-- | ---------- 
a1 | Allow,Not Allow,Disabled,WOW,Grant 
v2 | Not Allow,Disabled,WOW 
r1 | Allow,Disabled,WOW,Grant 
b4 | 
h7 | WOW,Grant 

有沒有wa Ÿ使它在MYSQL中?

+0

尼斯的問題。在我看來,像是從字典中取代了一些文字。 :) –

+0

好評:)但是我需要一個答案:( – Ofear

+0

你有沒有試過嗎? – hims056

回答

2

那麼你可以嘗試的東西沿着這些路線:

這是測試設置:

mysql> select * from table1; 
+------+------------+ 
| id | permission | 
+------+------------+ 
| a1 | 1, 2, 3, 4 | 
| v2 | 2, 3, 4 | 
+------+------------+ 
2 rows in set (0.01 sec) 



mysql> select * from table2; 
+------+------------+ 
| id | permission | 
+------+------------+ 
| 1 | Allow  | 
| 2 | Not Allow | 
| 3 | Disabled | 
+------+------------+ 
3 rows in set (0.01 sec) 


mysql> select id, GROUP_CONCAT(t2perm) from (SELECT t1.*, t2.id as t2id, t2.permission as t2perm from table2 t2 cross join table1 t1) crs where INSTR(permission, t2id) > 0 group by id; 
+------+--------------------------+ 
| id | GROUP_CONCAT(t2perm)  | 
+------+--------------------------+ 
| a1 | Allow,Not Allow,Disabled | 
| v2 | Not Allow,Disabled  | 
+------+--------------------------+ 
2 rows in set (0.00 sec) 

要解釋一下;第一你過加入兩個表,並且應該產生笛卡爾乘積,像這樣:

mysql> SELECT * from table2 cross join table1; 
+------+------------+------+------------+ 
| id | permission | id | permission | 
+------+------------+------+------------+ 
| 1 | Allow  | a1 | 1, 2, 3, 4 | 
| 1 | Allow  | v2 | 2, 3, 4 | 
| 2 | Not Allow | a1 | 1, 2, 3, 4 | 
| 2 | Not Allow | v2 | 2, 3, 4 | 
| 3 | Disabled | a1 | 1, 2, 3, 4 | 
| 3 | Disabled | v2 | 2, 3, 4 | 
+------+------------+------+------------+ 
6 rows in set (0.00 sec) 

從這一點來說,有一個串只選擇行包含在另一個(INSTR(許可,T2ID)=>映射權限到IDS),你就這樣結束了:

mysql> select * from (SELECT t1.*, t2.id as t2id, t2.permission as t2perm from table2 t2 cross join table1 t1) crs where INSTR(permission, t2id) > 0; 
+------+------------+------+-----------+ 
| id | permission | t2id | t2perm | 
+------+------------+------+-----------+ 
| a1 | 1, 2, 3, 4 | 1 | Allow  | 
| a1 | 1, 2, 3, 4 | 2 | Not Allow | 
| v2 | 2, 3, 4 | 2 | Not Allow | 
| a1 | 1, 2, 3, 4 | 3 | Disabled | 
| v2 | 2, 3, 4 | 3 | Disabled | 
+------+------------+------+-----------+ 
5 rows in set (0.00 sec) 

與GROUP_CONCAT現在只是彙總結果...

select id, GROUP_CONCAT(t2perm) from (SELECT t1.*, t2.id as t2id, t2.permission as t2perm from table2 t2 cross join table1 t1) crs where INSTR(permission, t2id) > 0 group by id; 
+0

@Ivica,'crs'是什麼意思? –

+0

歡迎:) @Praveen crs只是我們給我們的子選擇(派生表)的別名,所以我們可以使用它... (每個派生表都必須有自己的別名) – Ivica

+0

@Ivica所以我們可以在'crs'之前使用'as'嗎? –

0

我想你必須使用cases

但我認爲你想要做的是絕對錯誤的。你爲什麼要創建這樣的2個表?

+0

我已經有這些表... 你有這樣的代碼嗎? – Ofear

+0

如果第二個表總是相同,您可以刪除第二個表。我想這將是最簡單的解決方案。 你可以做到下一個:首先,你將不得不拆分整數。然後使用案例,CASE權限,當允許1時,... 但是,使用PHP可能會更方便。你做一個選擇查詢,拆分是爆炸,並使用案例/開關解決方案或如果/ elseif/else解決方案。 –

+0

有一個原因,爲什麼表建立這樣的:\並沒有其他的方式來使它 – Ofear

相關問題