MYSQL中的动态列名称

时间:2009-09-16 02:17:33

标签: sql mysql

昨天我通过询问偶然发生了凄惨列名的问题搞砸了。 这引起了有趣的解决方所以我会再次在这里问同样的问题,但这次我会直接将mysql转储,所以没有混淆。

CREATE TABLE `tbl1` (
  `UserID` char(15) DEFAULT NULL,
  `col1` char(15) DEFAULT NULL,
  `col2` char(15) DEFAULT NULL,
  `col3` char(15) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `tbl2` (
  `UserID` char(15) DEFAULT NULL,
  `col4` char(15) DEFAULT NULL,
  `col5` char(15) DEFAULT NULL,
  `col6` char(15) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO tbl1
  (`UserID`, `col1`, `col2`, `col3`)
VALUES
  ('user1', 'one', 'two', 'three');

INSERT INTO tbl1
  (`UserID`, `col1`, `col2`, `col3`)
VALUES
  ('user1', 'oneone', 'twotwo', 'threethree');

INSERT INTO tbl2
  (`UserID`, `col4`, `col5`, `col6`)
VALUES
  ('user1', 'col4name', 'col5name', 'col6name');

在mysql查询之后,我正在寻找的最终结果将是这样的。

CREATE TABLE `endresult` (
  `UserID` char(15) DEFAULT NULL,
  `col4name` char(15) DEFAULT NULL,
  `col5name` char(15) DEFAULT NULL,
  `col6name` char(15) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

您将看到user1在col4记录“col4name”下的tbl2上,由user1为该特定列添加了他/她的自定义名称。现在我想看到这些自定义列名显示在“endresult”表中。

我知道最好在最后使用php来显示,但我真的需要在mysql端做这个。 再次感谢

3 个答案:

答案 0 :(得分:1)

我认为将SQL语句作为字符串(动态地)执行可能是您最好的选择。请注意SQL注入和期望在此SQL语句中使用的数据。

类似的东西:

SET @qry = (
            SELECT CONCAT('SELECT t1.userid, 
                           t1.col1 AS "', t2.col4, '", 
                           t1.col2 AS "', t2.col5, '",
                           t1.col3 AS "', t2.col6, '"
                    FROM tbl1 t1') AS QUERY_TEXT                      
            FROM tbl2 t2 
            WHERE t2.userid = @userId
           );
PREPARE stmt FROM @qry;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

此查询将从tbl1返回数据,但col1,col2和col3由给定特定用户ID @userId的匹配tbl2记录中的值别名。

存在这个问题,我似乎无法弄清楚要在这个问题上扩展什么,以使其适用于单个SELECT语句中的多个用户。这是有道理的,因为当它们被命名为不同时,不可能正确排列列(另外,我相信这在SQL中是不可能的)。

答案 1 :(得分:1)

我认为您希望根据tbl1和tbl2的内容动态定义列名。

这是不可能的,你可以得到的最接近的是,动态地为列创建一个具有不同alliase的SQL语句(基于先前的SQL查询来查找正确的值)。这当然将仅限于一个给定用户的名称,因为几个用户可能有相互冲突的名称,但查询每列只需要一个别名...(这是BTW一个,虽然不是主要原因,为什么这可以不能直接在SQL中完成。

编辑注意: David Andres的回复显示了执行此类两步查询的一种方法。

答案 2 :(得分:0)

这是来自其他董事会...... 不知道如何申请我的情况?

也许这样的事情(为mysql数据库完成,你应该为你的连接修改它):

的MySQL> select user,CASE WHEN user ='root'THEN host WHEN user ='drupal'THEN password END FROM user WHERE user<>''; + ------------------ + ------------------------------ ---------------------------------------- + |用户|用户='root'时的情况然后主机WHEN user ='drupal'那么密码END | + ------------------ + ------------------------------ ---------------------------------------- + |根| localhost | |根|笔记本电脑 |根| 127.0.0.1 | | debian-sys-maint | NULL | | drupal | * 7AFEAE5774E672996251E09B946CB3953FC67656 | | drupal | | + ------------------ + ------------------------------ ---------------------------------------- +

你应该做类似的事情:

SELECT .... ON tbl1 JOIN tbl2 ON tbl1.col1 = tbl2.col2 ...