2011-07-05 9 views
0

私はこれをうまくやってくれないようです。過去には、通常、複数のSQL文でこれを行い、PHPでデータを結合します。私はこれがプログラムの最良の方法ではないことを知っています。だから私はすべてのデータを1つのSQLステートメントで取得しようとします。単一のSQLステートメント - それは可能ですか?

ここに表があります。

テーブルページ:

id name fields 
1 home 1,3,4 

テーブルdata_fields:

id field 
1 title 
2 subtitle 
3 description 
4 image 

テーブルpage_data:

id title subtitle description image link quote 
1 Hello null descriptionText null null null 

だから、基本的に私は、ページIDに応じて、ページデータを引き出したいです。

カンマで区切られたpages.fieldsフィールドを分割し、必要なフィールドをdata_fieldsから取得し、data_fieldsから取得したフィールド名に応じてpage_dataからデータを取得するにはどうすればよいですか?

+1

クエリのwhere句を使用します。あなたのクエリを表示してください – Ibu

+0

あなたのテーブル構造は私にとって信じられないほど冗長なようです。 page_dataテーブルに 'name'カラムを追加し、他の2つのテーブルを完全に削除するだけで、まったく同じデータを得ることができます。 –

+1

実際のテーブル定義、サンプルデータ、およびサンプル出力を表示 – Bohemian

答えて

1

リレーショナルモデルでは、ドメインはシンプルである必要があります。これを「第1正規形」と呼ぶ。明らかに言えば、複数の値を1つの列にパックしないでください。 列を別の表に分割して、pages表を正規化します。例えば、

CREATE TABLE page_fields { 
    page INT UNSIGNED, 
    field INT UNSIGNED, 
    FOREIGN KEY `page` REFERENCES `pages` (id), 
    FOREIGN KEY `field` REFERENCES `data_fields` (id) 
} Engine=InnoDB; 

次にpage_fieldsを用いpagesdata_fieldspage_dataテーブルを結合します。また

page_dataテーブルを再構築し、data_fieldsと離れて実行します。その後、

CREATE TABLE page_data { 
    page INT UNSIGNED, 
    name ENUM('title', 'subtitle', 'description', 'image', 'link', 'quote'), 
    data VARCHAR(...), 
    FOREIGN KEY page REFERENCES pages (id) 
} Engine=InnoDB; 

page_datapagesに参加。

0

データベースが正しく設計されていません。 Repeating groups within columnsは動作するPITAです。データベース設計をリファクタリングしてから、Joinsを使用してください。

1

あなたのデザインは冗長で貧弱です。必要に応じて、データベース構造の再編成をお手伝いします。 私は実際に理解していない、なぜあなたはいくつかのテーブルを保持したいですか?あなたが数えたすべての属性は単一のエンティティに属します。例えば、そこには多対1、多対多の関係はありませんので、単一の表で説明することができます。

create table PAGES (
    id int not null, 
    title varchar(256) null, 
    subtitle varchar(256) null, 
    description varchar(1024) null, 
    image blob null, 
    link varchar(256) null, 
    quote varchar(256) 
) 

ページが(ETCタイトルやdrescription、)いくつかの属性を持っていない場合このフィールドはNULLにすぎません。php-script内でこの情報を処理するときは、このフィールドに留意してください。

+0

はい、私は今それを見る。このフォーラムの複数の行でどのように返信しますか? – charliefarley321

+0

私は、更新されたデータベース構造で以下に返答します。 のIDページ名 1ホーム テーブルのフィールド: idフィールドタイプ 1つのタイトルテキスト 2の説明テキストエリア テーブルpage_data: page_idのFIELD_IDコンテンツ – charliefarley321

+0

だから、より良いデータベースの構造は?: テーブルページになります 1 1こんにちは 1 2 lorem ipsum dolor ... – charliefarley321

関連する問題