2009-09-16 39 views
0

昨天我错误地问了一个有错误列名的问题。 这造成了有趣的解决方案。所以我会在这里再次提出同样的问题,但这次我会直接使用mysql dump,所以不会有任何混淆。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对下它是由用户1添加为他COL4记录“col4name” tbl2的/她的自定义名称为特定列。现在我希望看到这些自定义列名显示在“endresult”表中。

我知道这将是最好做最后使用PHP来显示,但我真的需要在MySQL端做到这一点。 再次感谢

回答

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中是不可能的)。

+0

,我认为这应该工作,但是我的结束,我得到“未知列在 'COL4''字段列表“?任何想法为什么? – Ossi 2009-09-16 02:43:11

+0

在点”WHERE t2.userid = @userId“对查询做了一个小的编辑这曾经是”WHERE t1.userid = @userId“t1不是查询,尝试自行运行select语句(整个SELECT CONCAT业务) – 2009-09-16 02:48:42

+0

它只需要用于单个用户和他的记录...... I希望在这个查询的末尾添加像WHERE user ='user1'这样的东西,如果我能使用它的话 – Ossi 2009-09-16 02:53:06

1

我认为你想根据tbl1和tbl2的内容动态定义列名。

这是不可能的,最接近你可以得到这个,是动态地制作一个SQL语句与列的独特的联盟(基于以前的SQL查询找到合适的值)。这当然会受限于一个给定用户的名字,因为几个用户可能有冲突的名字,但是查询每列只会有一个别名......(这是顺便说一句,尽管不是主要原因,为什么这可以不要直接在SQL中完成)。

编辑注: David Andres的回复显示了一种做这种两步查询的方法。

+0

你已经击中了头部:一次只限于一个用户。 – 2009-09-16 02:40:16

0

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

也许这样的事情(对mysql数据库做,你应该修改这个为你的连接):

的mysql>选择用户,CASE WHEN用户=“根”,那么主机时,用户=“Drupal的”,然后密码END FROM用户WHERE用户<>''; + ------------------ + ----------------------------- ----------------------------------------- + |用户| CASE WHEN user ='root'THEN host WHEN user ='drupal'THEN password END | + ------------------ + ----------------------------- ----------------------------------------- + | root | localhost | | root |笔记本| | root | 127.0.0。1 | | debian-sys-maint | NULL | | drupal | * 7AFEAE5774E672996251E09B946CB3953FC67656 | | drupal | | + ------------------ + ----------------------------- ----------------------------------------- +

你应该做点什么像:

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