MySQLテーブルの束があり、エンドユーザーがPHPスクリプトを使用してそのデータを含むレポートを生成できるようにしたいとします。これらのテーブルのフィールド名をドロップダウンリストに表示すると、ユーザーは "first_name
= John"と言うことができます。すばらしいです。しかし、もしそれらのフィールド名を少し読みやすくしたいのであれば、どうしたらいいでしょうか?たとえば、フィールドに「first_pet_name
」の代わりに「First Petの名前」を選択できるようにしたいとします。テーブルをかなり頻繁に追加したり削除したりする可能性があるので、私は間違いなくその情報をマークアップに保存したくありません。これを取り除く最も簡単な方法は何ですか?MySQLテーブルからのレポートの生成
答えて
私は、アンダースコアをスペースで置き換え、上部ケーシングを最初の文字に置き換えるなどの簡単な操作を行います。
テーブルを作成して、テキスト情報をテーブルとカラムのペアにバインドすることができます。テーブルを持っていて、first_nameではなく、最初のペットの名前を表示するとします。
はのは(テーブル名ColumnTextInformationsを)言ってみましょう:
ParentTable | ParentColumn | Text
users | first_name | Name of First Pet
...
だから、あなたが列ラベルの一意の識別子を持っています。それを使用して
それは非常に簡単です:
SELECT Text
FROM ColumnTextInformations
WHERE parentTable = ? AND parentColumn = ?
私はデータベースに格納したいです。スキーマを使用すると、一般的に(あなたがデータベースを切り替えたとき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から読み取ることもできます。しかし、私はまだそれをよりフレキシブルなものとして扱っています(あなたは "このフィールドを表示すべきですか?"のような追加のデータをそこに簡単に入れることができます)。また、意図した目的のためにコメントを使用することもできます。
私はこれが最善の方法だと思います。メタデータにより、より柔軟でスケーラブルなレポートを作成できます。あなたは、あなたのユーザーがより良い、有用なレポートを得ることができるかもしれない他の情報を保存するかもしれません。 – Cesar
最も簡単な解決策は、の区切り識別子を使用することです。
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を参照してください。
これは良いアイデアだとは言えませんが、技術的にはです。 - 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)
これまでに列のエイリアスを聞いたことがありますか?
SELECT ペットName of First Pet
AS、ユーザー ユーザー= 'ビル' から USER_NAME AS Name of User
。
テーブルの名前にスペースを入れるのは良い考えですか? – Matthew
彼は、アンダースコアをスペースで動的に置き換えてから、ユーザーに表示することを意味すると思います。実際に名前にスペースを入れておけば、私の後の答えとBill Karwinのものが現れますが、私はその解決法を本当にお勧めしたいとは言いません。 – yukondude
これは素晴らしいですが、検索可能なフィールドを指定できるようにしたい(ドロップダウンが不要なフィールドでうまくいかないのを防ぐため)。 「人間のラベル」の詳細を示す別の表を持つことで、私はそれを行い、元の問題を解決することができます。 – Matthew