Вы можете использовать таблицу 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.КОЛОННЫ:
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_ и 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 *'] (http://stackoverflow.com/q/321299/)? Это, как правило, плохая практика, если вы не пишете программу администрирования БД. – outis
@outis: Фактически, этот код предоставляет администратору форума возможность напрямую изменять значения в пользовательской таблице, которая может иметь или не иметь дополнительных полей, добавленных к ней в будущем. Я также ненавижу использование «SELECT *», но, как вы заявляете, он оправдан и предпочтительнее в этом случае использования. – dotancohen
Мне любопытно, почему это когда-нибудь понадобится: что не так с именами оригинальных столбцов? – eggyal