昨天我通过询问偶然发生了凄惨列名的问题搞砸了。 这引起了有趣的解决方所以我会再次在这里问同样的问题,但这次我会直接将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端做这个。 再次感谢
答案 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 ...