2009-03-27 19 views
3

MySQLテーブルの束があり、エンドユーザーがPHPスクリプトを使用してそのデータを含むレポートを生成できるようにしたいとします。これらのテーブルのフィールド名をドロップダウンリストに表示すると、ユーザーは "first_name = John"と言うことができます。すばらしいです。しかし、もしそれらのフィールド名を少し読みやすくしたいのであれば、どうしたらいいでしょうか?たとえば、フィールドに「first_pet_name」の代わりに「First Petの名前」を選択できるようにしたいとします。テーブルをかなり頻繁に追加したり削除したりする可能性があるので、私は間違いなくその情報をマークアップに保存したくありません。これを取り除く最も簡単な方法は何ですか?MySQLテーブルからのレポートの生成

答えて

1

私は、アンダースコアをスペースで置き換え、上部ケーシングを最初の文字に置き換えるなどの簡単な操作を行います。

+0

テーブルの名前にスペースを入れるのは良い考えですか? – Matthew

+0

彼は、アンダースコアをスペースで動的に置き換えてから、ユーザーに表示することを意味すると思います。実際に名前にスペースを入れておけば、私の後の答えとBill Karwinのものが現れますが、私はその解決法を本当にお勧めしたいとは言いません。 – yukondude

+0

これは素晴らしいですが、検索可能なフィールドを指定できるようにしたい(ドロップダウンが不要なフィールドでうまくいかないのを防ぐため)。 「人間のラベル」の詳細を示す別の表を持つことで、私はそれを行い、元の問題を解決することができます。 – Matthew

1

テーブルを作成して、テキスト情報をテーブルとカラムのペアにバインドすることができます。テーブルを持っていて、first_nameではなく、最初のペットの名前を表示するとします。

はのは(テーブル名ColumnTextInformationsを)言ってみましょう:

ParentTable | ParentColumn | Text 
     users | first_name | Name of First Pet 
... 

だから、あなたが列ラベルの一意の識別子を持っています。それを使用して

それは非常に簡単です:

SELECT Text 
FROM ColumnTextInformations 
WHERE parentTable = ? AND parentColumn = ? 
1

私はデータベースに格納したいです。スキーマを使用すると、一般的に(あなたがデータベースを切り替えたときUSE後に何が起こるのか)MySQLでは、「データベース」と呼んでいるものである

CREATE TABLE human_labels (
    schema varchar(64) not null, 
    table varchar(64) not null, 
    column varchar(64) not null, 
    label tinytext not null, 
    primary key (schema, table, column) 
); 

。テーブルとカラムはかなり明白です。

もちろん、スキーマを変更するたびにDBAが更新するようにする必要があります。

私はMySQLがテーブルにはコメントを許可するが、カラムは許可しないと思っています。

編集:varcharを64に変更しました。これは、MySQLマニュアルで最大サイズとして扱われているためです。また、必要に応じて各列にコメントを付けることができます。また、それらをinformation_schema.columnsから読み取ることもできます。しかし、私はまだそれをよりフレキシブルなものとして扱っています(あなたは "このフィールドを表示すべきですか?"のような追加のデータをそこに簡単に入れることができます)。また、意図した目的のためにコメントを使用することもできます。

+0

私はこれが最善の方法だと思います。メタデータにより、より柔軟でスケーラブルなレポートを作成できます。あなたは、あなたのユーザーがより良い、有用なレポートを得ることができるかもしれない他の情報を保存するかもしれません。 – Cesar

0

最も簡単な解決策は、の区切り識別子を使用することです。

SQLクエリーでテーブル名とカラム名を区切る必要があります(それらの定義に使用されている文を含めてCREATE TABLEを使用してください)。これにより、テーブル名とカラム名をスペースで区切る必要があります。 。

CREATE TABLE `User Facts` (
    `User Name`   VARCHAR(100) 
    ... 
    `Name of First Pet` VARCHAR(100) 
    ... 
); 

SELECT `Name of First Pet` 
FROM `User Facts` 
WHERE `User Name` = 'Bill'; 

MySQLは、デフォルトで区切られた識別子にバックティックを使用しています(前述)。

詳しくは、Do different databases use different name quoteを参照してください。

+0

D'oh、あなたはバックティックアイデアに私を打ち負かしました。よかった。 – yukondude

+0

このように、狂気があります。また、すべてのDBAとプログラマからのLART - これらの名前を引用するものとすべてのクエリのためのすべて - を入力する必要があります。これを行う場合は、ビューを使用してこれらの名前を作成してください! – derobert

+0

@derobert:国際的な文字で綴られたSQL識別子は見たことがありませんか? –

0

これは良いアイデアだとは言えませんが、技術的にはです。 - MySQLでは、これらの識別子をコード全体でバックティックで囲むと、スペースを含むテーブルとカラムを作成できます。例:

mysql> create table `This is a Table` (`First Name` varchar(50), 
    `Name of First Pet` varchar(20)); 
Query OK, 0 rows affected (0.06 sec) 

mysql> insert into `This is a Table` values ('Tom', 'Skippy'); 
Query OK, 1 row affected (0.01 sec) 

mysql> select * from `This is a Table`; 
+------------+-------------------+ 
| First Name | Name of First Pet | 
+------------+-------------------+ 
| Tom  | Skippy   | 
+------------+-------------------+ 
1 row in set (0.00 sec) 
0

これまでに列のエイリアスを聞いたことがありますか?

SELECT ペットName of First Pet AS、ユーザー ユーザー= 'ビル' から USER_NAME AS Name of User

関連する問題