2010-03-08 78 views
0

我正在使用無法控制數據庫列名稱的CMS系統。和我有兩個相關的表:我如何使用別名從另一個表中選擇別名?

表:內容

+------------+----------+----------+----------+----------+ 
| content_id | column_1 | column_2 | column_3 | column_4 | 
+------------+----------+----------+----------+----------+ 
|   1 | stuff |  junk |  text |  info | 
|   2 | trash |  blah |  what |  bio | 
+------------+----------+----------+----------+----------+ 

表的欄

+------------+-------------+ 
| column_id | column_name | 
+------------+-------------+ 
|   1 | good_text | 
|   2 | bad_text | 
|   3 | blue_text | 
|   4 | red_text | 
+------------+-------------+ 

我想在這裏做什麼,從第一個表中選擇,但選擇列作爲第二個表中的column_name。所以,我的結果會是什麼樣子:

+------------+-----------+----------+-----------+----------+ 
| content_id | good_text | bad_text | blue_text | red_text | 
+------------+-----------+----------+-----------+----------+ 
|   1 |  stuff |  junk |  text |  info | 
|   2 |  trash |  blah |  what |  bio | 
+------------+-----------+----------+-----------+----------+ 

回答

0

據我所知,您不能使用子查詢作爲SQL的AS的目標。如果我是你,我會將column_names中的數據加載到一個數組中(我也將它緩存在內存數據庫中,因爲它不會經常更改),然後使用該數組構建我的SQL 。

一個非常粗略的例子(PHP):

$column_relations = array(); 

$sql = "SELECT * FROM column_names;"; 
$res = mysql_query($sql); 

while ($row = mysql_fetch_assoc($res)) 
{ 
    $column_relations[$row['column_name']] = 'column_' . $row['column_id']; 
} 

$sql = sprintf("SELECT content_id, '%s' AS good_text, '%s' AS bad_text, '%s' AS blue_text, '%s' AS red_text FROM content;", $column_relations['good_text'], $column_relations['bad_text'], $column_relations['blue_text'], $column_relations['red_text']); 
0

有沒有辦法做到這一點,但只要你的列將不與硬編碼的表變化過於頻繁,一VIEW別名可能就足夠了。

0
SELECT 
cn. column_id id, 
MAX(IF(content_id=1,column_1,null)) as good_text, 
MAX(IF(content_id=2,column_2,null)) as bad_text, 
MAX(IF(content_id=3,column_3,null)) as blue_text, 
MAX(IF(content_id=4,column_4,null)) as red_text 
FROM content ct 
INNER JOIN column_names cn ON (cn. column_id = ct.content_id) 
GROUP BY cn. column_id 

對不起,它應該是左連接,而不是內層。

您不能擁有動態數量的列,所以此解決方案只在您事先知道您可能擁有多少個 組時才起作用。