Mysql 交叉表查询

标签 mysql crosstab

存储内容和类别的表很少。内容和类别以多对多关系映射。

一个类别可以有很多内容。

一个内容可以包含在多个类别中。

因此我创建了 content_cat_xref 表来映射这些表。

类别表 - id、name 等

内容表 - id, name, type_code(read_it, play_it, prove_it, watch_it)

content_cat_xref - content_id、category_id 等

我想显示包含内容类型的类别以及每种内容类型的内容数量,如下所示。

enter image description here

但我得到的结果如下。

enter image description here

我的查询如下

select 
ccx.category_id, 
IF(count(c.id) > 0, "True", "False") as Sections_with_content,
(CASE WHEN (c.type_code = 'READ_IT') THEN count(c.id) ELSE 0 END) as "READ_IT",
(CASE WHEN (c.type_code = 'WATCH_IT') THEN count(c.id) ELSE 0 END) as "WATCH_IT",
(CASE WHEN (c.type_code = 'PLAY_IT') THEN count(c.id) ELSE 0 END) as "PLAY_IT",
(CASE WHEN (c.type_code = 'PROVE_IT') THEN count(c.id) ELSE 0 END) as "PROVE_IT",
count(c.id) 
  from content_cat_xref as ccx left outer join content as c
  on ccx.content_id = c.id 
  group by ccx.category_id, c.type_code

如果谁有这种经验,对我解决问题会有帮助。

最佳答案

不要按c.type_code 分组,因为这会导致将各种类型分组到单独的记录中。条件计数的全部意义在于对整个组(在本例中为 category_id)进行处理并仅返回相关计数。

更新

您还需要更改执行条件计数的方式。条件必须在 count()(或 sum())函数内,而不是在函数外,因为您希望在所有情况下都显示结果。所以,而不是

(CASE WHEN (c.type_code = 'READ_IT') THEN count(c.id) ELSE 0 END) as "READ_IT"

COUNT(CASE WHEN (c.type_code = 'READ_IT') THEN 1 ELSE NULL END) as "READ_IT"

说明:case语句如果条件匹配则返回值1,否则返回nullCount() 函数计算所有非空值。其他所有字段的表达式在上面的例子的基础上进行更改。

关于Mysql 交叉表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40214905/

相关文章:

mysql - 我有一个带有 uuid 和系统列的表。我需要一个查询来仅返回具有 system=1 的 uuid,而不返回具有 system= 1 nad 2 的 uuid

sorting - 如何在 jasper 中对交叉表的列标题值进行排序?

postgresql - 组内级联的Postgres交叉表(文本,文本)

sql - 在 PostgreSQL 的一行中显示一列的多个值

MySQL 1300 无效的 big5 字符串 : '\xC3\x97 '

php - mysql 从表中选择第n列

sql - Postgres 计算元素并按日期列

r - 按数据集中的外观对交叉表的列和行进行排序

php - 表中同一字段的多个查询

mysql - 网站 javafx 2.x 应用程序中的 scala mysql 连接在 IDE 中工作,而不是在线发布时