你可以使用INFORMATION_SCHEMA.COLUMNS表来构建查询,然后使用动态SQL来执行它。
首先,让我们创建一个名为"dotancohen"的示例数据库和一个名为"mytable"的表。
mysql> drop database if exists dotancohen;
Query OK, 1 row affected (0.03 sec)
mysql> create database dotancohen;
Query OK, 1 row affected (0.00 sec)
mysql> use dotancohen
Database changed
mysql> create table mytable
-> (
-> id int not null auto_increment,
-> username varchar(30),
-> realname varchar(30),
-> primary key (id)
-> );
Query OK, 0 rows affected (0.06 sec)
mysql> insert into mytable (realname,username) values
-> ('rolando','odnalor'),('pamela','alemap'),
-> ('dominique','euqinimod'),('diamond','dnomaid');
Query OK, 4 rows affected (0.05 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from mytable;
+
| id | username | realname |
+
| 1 | odnalor | rolando |
| 2 | alemap | pamela |
| 3 | euqinimod | dominique |
| 4 | dnomaid | diamond |
+
4 rows in set (0.00 sec)
mysql>
这里是名为INFORMATION_SCHEMA.COLUMNS的元数据表:
mysql> desc INFORMATION_SCHEMA.COLUMNS;
+
| Field | Type | Null | Key | Default | Extra |
+
| TABLE_CATALOG | varchar(512) | NO | | | |
| TABLE_SCHEMA | varchar(64) | NO | | | |
| TABLE_NAME | varchar(64) | NO | | | |
| COLUMN_NAME | varchar(64) | NO | | | |
| ORDINAL_POSITION | bigint(21) unsigned | NO | | 0 | |
| COLUMN_DEFAULT | longtext | YES | | NULL | |
| IS_NULLABLE | varchar(3) | NO | | | |
| DATA_TYPE | varchar(64) | NO | | | |
| CHARACTER_MAXIMUM_LENGTH | bigint(21) unsigned | YES | | NULL | |
| CHARACTER_OCTET_LENGTH | bigint(21) unsigned | YES | | NULL | |
| NUMERIC_PRECISION | bigint(21) unsigned | YES | | NULL | |
| NUMERIC_SCALE | bigint(21) unsigned | YES | | NULL | |
| CHARACTER_SET_NAME | varchar(32) | YES | | NULL | |
| COLLATION_NAME | varchar(32) | YES | | NULL | |
| COLUMN_TYPE | longtext | NO | | NULL | |
| COLUMN_KEY | varchar(3) | NO | | | |
| EXTRA | varchar(27) | NO | | | |
| PRIVILEGES | varchar(80) | NO | | | |
| COLUMN_COMMENT | varchar(1024) | NO | | | |
+
19 rows in set (0.02 sec)
mysql>
你需要从这个表中获取以下列:
- table_schema
- table_name
- column_name
- ordinal_position
你所要求的是在column_name前加上a_。
以下是查询语句及其执行方法:
select concat('select ',column_list,' from ',dbtb) into @newsql
from (select group_concat(concat(column_name,' a_',column_name)) column_list,
concat(table_schema,'.',table_name) dbtb from information_schema.columns
where table_schema = 'dotancohen' and table_name = 'mytable'
order by ordinal_position) A;
select @newsql;
prepare stmt from @newsql;
execute stmt;
deallocate prepare stmt;
让我们执行它
mysql> select concat('select ',column_list,' from ',dbtb) into @newsql
-> from (select group_concat(concat(column_name,' a_',column_name)) column_list,
-> concat(table_schema,'.',table_name) dbtb from information_schema.columns
-> where table_schema = 'dotancohen' and table_name = 'mytable'
-> order by ordinal_position) A;
Query OK, 1 row affected (0.01 sec)
mysql> select @newsql;
+
| @newsql |
+
| select id a_id,username a_username,realname a_realname from dotancohen.mytable |
+
1 row in set (0.00 sec)
mysql> prepare stmt from @newsql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql> execute stmt;
+
| a_id | a_username | a_realname |
+
| 1 | odnalor | rolando |
| 2 | alemap | pamela |
| 3 | euqinimod | dominique |
| 4 | dnomaid | diamond |
+
4 rows in set (0.01 sec)
mysql> deallocate prepare stmt;
Query OK, 0 rows affected (0.00 sec)
mysql>
试一试吧!!!
你在问题中提到:使用SELECT username AS a_username的格式是无法帮助的,因为我需要继续使用*字段选择。
要实现我的建议,你只需要按照以下方式运行查询,使用tableA表:
select concat('select ',column_list,' from ',dbtb) into @newsql
from (select group_concat(concat(column_name,' a_',column_name)) column_list,
concat(table_schema,'.',table_name) dbtb from information_schema.columns
where table_schema = DATABASE() and table_name = 'tableA'
order by ordinal_position) A;
当你检索到查询结果时,只需将其作为查询提交给
mysql_query。
SELECT *
?通常情况下这是不好的做法,除非你正在编写一个数据库管理程序。 - outisSELECT *
,但正如你所说,在这种情况下是可以证明并且更可取的。 - dotancohenSELECT table_of_interest.*, anotherTable.someField, anotherTable.someOtherField
,并且存在someField
或者someOtherField
可能存在于table_of_interest
中。 - dotancohenSELECT anotherTable.someField, anotherTable.someOtherField, table_of_interest.* FROM ...
,那么前两个返回字段的顺序是可靠的,并且之后的所有内容都来自于table_of_interest
。 - eggyalgetColumnMeta()
),从中派生列的表的名称是可以在结果中获得的。我不知道你是如何连接MySQL的,但也许这可以消除你重命名列的需要? - eggyal