Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带动态字段的SQL_Mysql_Sql_Dynamic Data - Fatal编程技术网

Mysql 带动态字段的SQL

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

我有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,
    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