2011-07-05 182 views
0

我似乎無法解決這個問題,在過去,我通常會用多個SQL語句來做這件事,然後用PHP加入數據。我意識到這不是編程的最佳方式,所以我想嘗試使用一條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'列並完全刪除其他兩個表即可獲得完全相同的數據。 –

+1

顯示實際表格defs,示例數據和示例輸出 – Bohemian

回答

1

在關係模型下,域應該很簡單;這被稱爲「第一範式」。按照更簡單的說法,不要在一個列中打包多個值。通過將fields列分解到另一個表來規範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; 

然後加入pagespage_data

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) 
) 

如果頁面不具有一些屬性(標題或drescription等)這個字段只是NULL,當你在php-script中處理這些信息時你會記住它。

+0

是的,我現在明白了。我如何在這個論壇回覆多行? – charliefarley321

+0

我會在下面回覆更新的數據庫結構。 – charliefarley321

+0

所以更好的數據庫結構將是?: 表頁: ID頁面名稱 1家 表中的字段: id字段類型 1個標題文本 2描述的textarea 表page_data: PAGE_ID FIELD_ID內容 1 1你好 1 2 lorem ipsum dolor ... – charliefarley321

相關問題