我如何使用别名从另一个表中选择别名?

问题描述:

我正在使用无法控制数据库列名称的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 | 
+------------+-----------+----------+-----------+----------+ 

据我所知,您不能使用子查询作为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']); 

有没有办法做到这一点,但只要你的列将不与硬编码的表变化过于频繁,一VIEW别名可能就足够了。

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 

对不起,它应该是左连接,而不是内层。

您不能拥有动态数量的列,所以此解决方案只在您事先知道您可能拥有多少个 组时才起作用。