mysql - 按不存在的值分组

Posted

技术标签:

【中文标题】mysql - 按不存在的值分组【英文标题】:mysql - group by a non-existent value 【发布时间】:2013-09-05 01:32:18 【问题描述】:

是否可以按不存在进行分组(对不起,如果这不是正确的术语)。

例如,如果我有一个表格,例如:

post_id - 状态

1 - 活跃

2 - 暂停

3 - 保持

状态表的可能值有:活动、暂停、保持、删除

但状态列在任何给定时间可能有也可能没有所有这些状态类型,但我仍然希望返回一个计数为 0 的状态,即使它不在其中。

是否可以做一些事情,例如(伪查询):

SELECT COUNT(post_id), status(active,suspended,hold,deleted) FROM users GROUP BY status

附:在有人建议不要以这种方式制作表格之前,我别无选择,因为这是该 CMS 的属性表格的结构方式。

【问题讨论】:

您并使用合成数据对查询结果进行连接。例如。 select coalesce(r.count, 0) as count, s.status from statuses as s left join that query as r on s.status = r.status,其中 statuses 包含已分组的已知状态集。 我该怎么做? 您能否用几行示例数据和所需的输出来说明您的问题。也许只有我一个人,但我很难理解你真正追求的是什么。 同上@peterm,abd 为什么您尝试从用户表中进行选择?当然,这将是帖子表。你想按用户分组吗?请详细说明。 不管表名是什么,都是假表,数据简单,问题简单 【参考方案1】:

试试case声明

SELECT SUM(CASE WHEN status = "active" THEN 1 ELSE 0 END) active_count,
       SUM(CASE WHEN status = "suspended" THEN 1 ELSE 0 END) suspended_count,
       SUM(CASE WHEN status = "hold" THEN 1 ELSE 0 END) hold_count,
       SUM(CASE WHEN status = "deleted" THEN 1 ELSE 0 END) deleted_count
FROM posts;

还有这个

SELECT "active", SUM(CASE WHEN status = "active" THEN 1 ELSE 0 END) active_count
FROM posts
UNION
SELECT "suspended", SUM(CASE WHEN status = "suspended" THEN 1 ELSE 0 END) suspended_count
FROM posts
UNION
SELECT "hold", SUM(CASE WHEN status = "hold" THEN 1 ELSE 0 END) hold_count
FROM posts
UNION
SELECT "deleted", SUM(CASE WHEN status = "deleted" THEN 1 ELSE 0 END) deleted_count
FROM posts

更好

SELECT "active", COUNT(*) active_count
FROM posts WHERE status = "active"
UNION
SELECT "suspended", COUNT(*) suspended_count
FROM posts WHERE status = "suspended"
UNION
SELECT "hold", COUNT(*) hold_count
FROM posts WHERE status = "hold"
UNION
SELECT "deleted", COUNT(*) deleted_count
FROM posts WHERE status = "deleted"

见 SQL fiddle here

【讨论】:

【参考方案2】:

我的查询是相同的,但在 Oracle 中。接下来做这项工作。

select * from (
  select status from users
)
pivot (
  count(status) as count
  for status in ('active' as A, 'suspended' as S, 'hold' as H, 'deleted' as D)
);

致谢:Using pivot on multiple columns of an Oracle row

【讨论】:

以上是关于mysql - 按不存在的值分组的主要内容,如果未能解决你的问题,请参考以下文章

如何选择数据库 MySQL 中不存在的值

如果行不存在具有相同的值,如何在 Mysql 中插入行

当存在 2 个分组条件时如何计算 mysql/sql 中的百分比

Mysql如果某个字段值存在则更新另一个字段的值为原值+100,命令应该如何写?

mysql判断一条记录是否存在,如果存在,则更新此语句,如果不存在,则插入

如何将约束添加到 MYSQL 中的列仅以保存已存在于同一表的另一列中的值? [复制]