mysql - 带有动态字段的 SQL

标签 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,
    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 查询,它将列出属于给定类别的所有帖子,并将这些帖子的所有字段列为单独的列,类别模板名称作为列名称。结果应该是这样的:

Post Id     Post_Name         Budget         Location        Time
1           America is good   1000 $         New York        January 2012
2           Hot Travel        2000 $         Brasil          May 2012

我的问题是,不同类别的类别模板具有不同的名称,因此很难编写一个通用的查询。例如,旅行类别可以有 3 个模板(位置、预算、时间),而书籍类别有 4 个模板(摘要、内容、作者简介、摘要)。当输出列的确切数量不同时,如何编写将一列变成多列的语句(基于同一行但另一列中的值)?同样,考虑到输出列的数量会有所不同,我如何编写将一列变成多个列标题的语句?

最佳答案

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

关于mysql - 带有动态字段的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631713/

相关文章:

php - 将密码存储到数据库中/从数据库中读取密码

python - 将表定义类从 SQLAlchemy 隐藏到普通 MySQL

mysql - 从MySQL日期获取一个月内的用户数

SQL Server : How to check if CLR is enabled?

mysql - 如何得到除法的商和余数

mysql - 统计多外键表的记录(MySQL)

asp.net-mvc - asp.net MVC 显示模板和编辑器模板命名约定

php - 创建时为 div 分配唯一 ID,然后使用 jquery 引用

c# - Roland Pheasant 使用 DynamicData 实现尾部方法

MySQL - 使用 IF 条件连接表