Mysql 带动态字段的SQL
我有4张桌子:Mysql 带动态字段的SQL,mysql,sql,dynamic-data,Mysql,Sql,Dynamic Data,我有4张桌子: CREATE TABLE Category ( Id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(255) NOT NULL, ) Engine=InnoDB; CREATE TABLE Category_Template ( Id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(255) NOT NULL, Cat
CREATE TABLE Category (
Id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(255) NOT NULL,
) Engine=InnoDB;
CREATE TABLE Category_Template (
Id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(255) NOT NULL,
Category_Id INT UNSIGNED NOT NULL,
FOREIGN KEY (Category_Id) REFERENCES Category (Id)
) Engine=InnoDB;
CREATE TABLE Post (
Id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
Post_Name VARCHAR(255) NOT NULL,
Category_Id INT UNSIGNED NOT NULL,
FOREIGN KEY (Category_Id) REFERENCES Category (Id)
) Engine=InnoDB;
CREATE TABLE Post_Fields (
Id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
Post_Id INT UNSIGNED NOT NULL,
Category_Template_Id INT UNSIGNED NOT NULL,
Value VARCHAR(255) NOT NULL,
FOREIGN KEY (Category_Template_Id) REFERENCES Category_Template (Id)
) Engine=InnoDB;
例如,假设有一个职位属于旅行类别:
INSERT INTO Category
(Id, Name)
VALUES
(1, 'Where to go?')
;
INSERT INTO Category_Template
(Category_Template_Id, Name, Category_Id)
VALUES
(1, 'Budget', 1),
(2, 'Location', 1),
(3, 'Time', 1)
;
INSERT INTO Post
(PostId, Post_Name, Category_Id)
VALUES
(1, 'America is good', 1),
(2, 'Hot Travel', 1)
;
INSERT INTO Post_Fields
(Id, Post_Id, Category_Template_Id, Value)
VALUES
(1, 1, 1, '1000 $'),
(1, 1, 2, 'New York'),
(1, 1, 3, 'January 2012'),
(1, 2, 1, '2000 $'),
(1, 2, 2, 'Brasil'),
(1, 2, 3, 'May 2012')
;
我想运行一个SQL查询,它将列出属于给定类别的所有帖子,并将这些帖子的所有字段作为单独的列列出,其中类别模板名称作为列名。结果应该是:
职位Id职位名称预算地点时间
1美国好1000美元纽约2012年1月
2热旅行2000美元巴西2012年5月
我的问题是,不同类别的类别模板具有不同的名称,因此很难编写一个通用查询。例如,旅游类别可以有3个模板(地点、预算、时间),而书籍类别可以有4个模板(摘要、内容、作者简历、摘要)。当输出列的确切数目不同时,如何编写将一列转换为多列的语句(基于同一行中另一列中的值)?类似地,考虑到输出列的数量会有所不同,如何编写将一列转换为多列标题的语句?就是一个例子。您希望将行透视到ColumnSroper(这里是SQL语句)比任何特殊模式和示例数据格式更有用。请使用
CREATE TABLE
和INSERT。。。样本的值
。所需的结果不需要以示例代码的形式表示。@甘迪尔:问题仍然需要以SQL的形式表示表架构和示例数据。实际上,类别模板也是基于类别的动态模板。
SELECT Post_Id as `Post Id`, Post_Name,
(SELECT Value FROM Post_Fields WHERE Category_Template_Id=1
AND Post_Fields.Post_Id=Post.Post_id) AS `Budget`,
... more of the same ...
FROM Post WHERE Post_Id = 1
SELECT Post_Id as `Post Id`, Post_Name,
(SELECT Value FROM Post_Fields WHERE Category_Template_Id=1
AND Post_Fields.Post_Id=Post.Post_id) AS `Budget`,
... more of the same ...
FROM Post WHERE Post_Id = 1