单个SQL语句 - 可能吗?

时间:2011-07-05 07:09:25

标签: mysql

我似乎无法解决这个问题,过去我通常会使用多个SQL语句执行此操作并使用PHP连接数据。我知道这不是最好的编程方式,所以我想尝试用一个SQL语句获取所有数据。

以下是表格。

表格页:

id name fields
1 home 1,3,4

table data_fields:

id field
1 title
2 subtitle
3 description
4 image

table page_data:

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

所以基本上我想根据页面ID来提取页面数据。

如何拆分用逗号分隔的pages.fields字段,然后从data_fields获取所需的字段,然后从page_data中提取数据,具体取决于从data_fields检索的字段名称?

3 个答案:

答案 0 :(得分:1)

在关系模型下,域应该简单;这被称为“第一范式”。换句话说,不要在一列中打包多个值。通过将pages列拆分为另一个表来规范化fields表。例如,

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;

然后使用pages加入data_fieldspage_datapage_fields表。

或者,重新构建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;

然后与pages加入page_data

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

如果页面没有某些属性(标题或drescription等),这个字段只是NULL,你将在php脚本中处理这些信息时记住它。

答案 2 :(得分:0)

您的数据库设计不合理。 Repeating groups within columns是与之合作的PITA。您应该重构数据库设计,然后使用Joins

相关问题