我正在使用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 |
+------------+-----------+----------+-----------+----------+
答案 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。
您不能拥有动态数量的列,因此只有事先了解了多少列,此解决方案才有效 你可能拥有的团体。