2011-07-05 168 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

相关问题