MYSQL - 真/假动态数据透视表

标签 mysql pivot-table

<分区>

我正在尝试构建一个以唯一列值作为列名的表,但我不确定该怎么做。这些值将为 true 或 false/null。

这是设置:

项目

ProjectID   | ....
---------------------------
1111        | .....
2222        | .....

PROJECT_TAGS

TagID  | ProjectID | TagDefID (TagNameID fkey)
-----------------------------
1      | 1111      | 5
2      | 1111      | 6
3      | 2222      | 5

TAG_NAMES

TagNameID | TagName
-----------------------------
5         | Is Really Cool
6         | Is Awesome

结果

ProjectID | Is Really Cool | Is Awesome
-----------------------------------------
1111      | true           | true
2222      | true           |      

现在棘手的部分是随着时间的推移将添加其他标签类型。必须遍历每个项目 ID 似乎真的很粗鲁而且很慢,所以我希望会有某种神奇的 SQL 技巧来解决这个问题。基本上,由于某些原因,我需要制作数据库的 XML 电子表格类型 View 。

谢谢!

最佳答案

你可以这样做一个数据透视表:

SELECT P.ProjectID,
  MAX(CASE WHEN PT.TagDefID=5 THEN true END) AS `Is Really Cool`,
  MAX(CASE WHEN PT.TagDefID=6 THEN true END) AS `Is Awesome`
FROM PROJECTS AS P
LEFT OUTER JOIN PROJECT_TAGS AS PT ON P.ProjectID = PT.ProjectID
GROUP BY P.ProjectID;

SQL 对于它在数据中发现的标签没有特别的魔力。这样做的原因是 SQL 选择列表必须显式命名结果中的所有列,并且查询必须在开始读取数据之前命名它们。查询无法动态地将列动态添加到结果集中。

所以你需要分两步做一个数据透视表:

  1. 查询可能的标签。
  2. 将 SQL 查询格式化为每个标记一列。

在 SQL 中没有捷径。

关于MYSQL - 真/假动态数据透视表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45724029/

相关文章:

php - 使用 php 将动态 LI 发送到 mySQL 表中

Excel:在数据透视表中使用列分组的 count() 的 max()

excel - 更新 Excel 中多个数据透视表上的数据源

python - 将一列拆分为多列,计数频率: 'int' object is not iterable

vba - 使用 VBA 在 Excel 中删除工作表和数据透视表

mysql - 如何在以下查询中使用正则表达式?

带有查询变量的 MySQL 子查询

mysql - 如何针对单个父表设计多个子表?

mysql - Cakephp 虚拟字段如果此列为空则使用此列

python - 从使用 python pandas 制作的数据透视表中进行过滤和选择