【问题标题】:Mysql Crostab queryMysql 交叉表查询
【发布时间】:2017-03-06 00:33:43
【问题描述】:

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

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

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

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

类别表 - id、名称等

内容表 - id、名称、type_code(read_it、play_it、prove_it、watch_it)

content_cat_xref - content_id、category_id 等

我想显示具有内容类型的类别和每种内容类型的内容计数,如下所示。

但我得到如下。

我的查询如下

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

如果有人有这种经验将有助于我解决问题。

【问题讨论】:

    标签: mysql crosstab


    【解决方案1】:

    不要按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() 函数计算所有非空值。根据上例更改所有其他字段的表达式。

    【讨论】:

    • 感谢您的评论。然后它将显示错误类型代码下的总数。在这种情况下,您能帮我检索相关计数吗?
    • 对不起,我不明白你的后续问题。
    • 嗯,我想我明白了,我会在一分钟内更新我的答案。
    • 非常感谢。它工作正常。一个问题。为什么我们在这里使用 NULL 而不是 0。 THEN 1 ELSE NULL END
    • 我在答案的最后一段解释了这一点。
    猜你喜欢
    • 1970-01-01
    • 2020-03-18
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2011-03-01
    • 2014-10-23
    相关资源
    最近更新 更多