我如何使用别名从另一个表中选择别名?
问题描述:
我正在使用无法控制数据库列名称的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
对不起,它应该是左连接,而不是内层。
您不能拥有动态数量的列,所以此解决方案只在您事先知道您可能拥有多少个 组时才起作用。