我如何用另一个表中的别名选择mysql?

时间:2010-03-08 20:13:16

标签: mysql

我正在使用CMS系统,我无法控制数据库列名。我有两个相关的表格:

表:内容

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

表:column_names

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

3 个答案:

答案 0 :(得分: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']);

答案 1 :(得分:0)

没有办法做到这一点,但只要您的列不会经常更改,该表上带有硬编码别名的VIEW就足够了。

答案 2 :(得分: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

抱歉,它应该是LEFT JOIN,而不是INNER。

您不能拥有动态数量的列,因此只有事先了解了多少列,此解决方案才有效 你可能拥有的团体。