7

假设一个查询,例如:

SELECT * FROM tableA;

如何a_在每列的名称前添加?例如,如果有一列“用户名”,它将在结果中作为“a_username”访问。

编辑:格式SELECT username AS a_username无济于事,因为我需要继续使用*字段选择。存在 JOIN,并且与 JOIN 中另一个表的返回列存在潜在冲突。我将遍历返回的列 (foreach),并且只想将来自特定表的列(其架构可能会更改)输出到 HTML 输入字段,站点管理员可以在其中直接编辑字段的内容。有问题的 SQL 查询看起来像SELECT firstTable.*, anotherTable.someField, anotherTable.someOtherField,并且它们存在 someField 或 someOtherField 存在于 firstTable 中的可能性。

谢谢。

4

5 回答 5

11

您可以使用 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>

您需要从该表中获取以下列:

  • 表模式
  • 表名
  • 列名
  • ordinal_position

您要求的是在 column_name 和 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的查询。

于 2012-04-24T17:29:58.263 回答
3

您需要列出列,例如

SELECT username AS a_username FROM tableA;

或者,在后端进行后处理,例如更改代码中的数组键

于 2012-04-16T16:31:35.277 回答
2

创建一个包含重命名列的视图,例如 -

CREATE VIEW a_view AS SELECT username AS a_username FROM table;

然后参考这个观点。

于 2012-04-26T10:19:31.663 回答
1

如前所述,没有标准方法可以在常规查询中为列名添加前缀。

但是如果你真的想实现它,你可以编写一个存储过程,它会查询 information_schema 以获取表中的列列表,然后一一添加前缀。之后,可以将查询连接为字符串,PREPARE然后将其连接EXECUTE起来。

这种方法的一个缺点是您不能加入存储过程的结果。但是,当然,您也可以为您发出的每种类型的查询创建一个存储过程。然后可以将任何表的字段前缀作为单独的 generic FUNCTION

不过,在我看来,所有这些东西都像是矫枉过正。我建议要么重命名实际的列,以便它们始终带有前缀,要么只列出所有带有AS别名的结果字段,如 Scibuff 和 A​​lister 建议的那样。

于 2012-04-24T13:47:00.127 回答
0

我不相信它可以自动为所有列完成,但您可以列出任意数量的列AS

SELECT id    AS a_id, 
       name  AS a_name, 
       email AS a_email  /*, etc....*/
FROM tableA;

我只是为了更清楚而插入了换行符。

于 2012-04-16T16:34:18.873 回答