7

次のようなクエリを想定します。

SELECT * FROM tableA;

a_各列の名前の前に付けるにはどうすればよいですか?たとえば、列「username」がある場合、結果では「a_username」としてアクセスされます。

編集:フィールド選択SELECT username AS a_usernameを引き続き使用する必要があるため、この形式は役に立ちません。*JOINがあり、JOIN内の別のテーブルから返された列と競合する可能性があります。返された列(foreach)を繰り返し処理し、特定のテーブル(スキーマが変更される可能性がある)からの列のみをHTML入力フィールドに出力して、サイト管理者がフィールドのコンテンツを直接編集できるようにします。問題のSQLクエリは次のようSELECT firstTable.*, anotherTable.someField, anotherTable.someOtherFieldになり、firstTableにsomeFieldまたはsomeOtherFieldが存在する可能性があります。

ありがとう。

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>

この表から必要なのは、次の列です。

  • table_schema
  • table_name
  • column_name
  • 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 usernameASa_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にクエリを実行してテーブル内の列のリストを取得し、それらに1つずつプレフィックスを付けるストアドプロシージャを作成できます。その後、クエリを文字列として連結することが可能にPREPAREなりEXECUTEます。

このアプローチの欠点は、ストアドプロシージャの結果に参加できないという事実です。ただし、もちろん、発行するクエリの種類ごとにストアドプロシージャを作成することもできます。次に、任意のテーブルのフィールドの前に、別のジェネリックを作成できますFUNCTION

しかし、これらすべてのものは私にはやり過ぎのように聞こえます。ASScibuffとAlisterが提案したように、実際の列の名前を変更して常にプレフィックスを付けるか、すべての結果フィールドをエイリアスで一覧表示することをお勧めします。

于 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 に答える