在where子句中使用group by进行条件计数

人群

我有一个简单的消息传递系统-将所有消息保留在一个表中。每个消息都可以(并且应该)与其他3个表之一相关联,这些表代表网站的某些部分。这是创建表语句

CREATE TABLE `messages` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `from_user_id` int(11) DEFAULT NULL,
  `to_user_id` int(11) DEFAULT NULL,
  `message` text COLLATE utf8_bin,
  `table1_id` int(11) DEFAULT NULL,
  `table2_id` int(11) DEFAULT NULL,
  `table3_id` int(11) DEFAULT NULL,
  `is_unread` tinyint(1) DEFAULT NULL,
  `date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

对于每个消息,table1_id, table2_id and table3_id如果某列具有值,则表示其余2为空。这是sqlfiddle结构和示例数据:http ://sqlfiddle.com/#!9/b98a2/1/0

因此,table1_id, table2_id and table3_id我在分组时使用了一些线程-显示消息列表。这是我的查询

SELECT 
  id,
  table1_id,
  table2_id,
  table3_id,
  message,
  from_user_id,
  to_user_id,
  COUNT(table1_id) AS t1_count,
  COUNT(table2_id) AS t2_count,
  COUNT(table3_id) AS t3_count,
  MAX(CASE WHEN to_user_id = 10 AND is_unread = 1 THEN 1 END) AS is_unread,
  COUNT(CASE WHEN to_user_id = 10 THEN 1 END) AS inbox_count
FROM
  messages
WHERE to_user_id = 10 OR from_user_id = 10
GROUP BY table1_id,
  table2_id,
  table3_id
ORDER BY id DESC

这是在sqlfiddle http://sqlfiddle.com/#!9/b98a2/2/0中

当我必须显示所有消息时,此查询工作正常,但是例如,如果我只想显示用户的收件箱,则id = 10必须检查每个线程至少有一条消息的接收条件,因此我尝试应用条件AND inbox_count > 0导致错误Unknown column 'inbox_count' in 'where clause'

我试图列出类似于gmail的消息-显示t1_count, t2_count or t3_count每个线程的总messages()数,这就是为什么我无法删除该OR from_user_id = 10部分的原因。

为什么找不到该列以及如何应用该条件以显示仅接收(传出)邮件的列表。

w

除非我完全误解了您的意图,否则...如果您想过滤inbox_count > 0到,那么我想您想添加一个

HAVING COUNT(CASE WHEN to_user_id = 10 THEN 1 END) > 0

group by条款之后。这将删除与没有任何消息的“线程” to_user = 10

有关示例,请参见此小提琴

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在where子句中使用group by进行条件计数

来自分类Dev

在WHERE子句中使用可选条件的正确方法

来自分类Dev

在带有IN条件的where子句中使用CASE

来自分类Dev

在where子句中使用多个条件的缺点

来自分类Dev

可以在WHERE子句中使用集合,并以IN为条件?

来自分类Dev

在 WHERE 子句中使用 AND 和 OR 条件得到错误的结果

来自分类Dev

PostgreSQL:在函数中使用 where 子句中的条件

来自分类Dev

在where子句中使用每个子查询在SQL Server中进行计数

来自分类Dev

通过在where子句中使用术语进行排序

来自分类Dev

在where子句中使用OR进行缓慢查询

来自分类Dev

在where子句中使用OR条件和Null进行右外部联接-SQL SERVER

来自分类Dev

如何使用解析计数进行条件计数?

来自分类Dev

使用where子句中的计数条件选择行

来自分类Dev

使用awk对条件进行计数

来自分类Dev

如何在MySQL中使用GROUP BY和条件进行计数

来自分类Dev

在MySQL中使用where条件对行进行计数

来自分类Dev

SQL JOIN COUNT 然后在 where 子句中使用该计数值

来自分类Dev

在WHERE子句中使用过滤条件和JOIN条件有什么区别

来自分类Dev

使用多个条件对不同值进行计数

来自分类Dev

使用sqldf根据多个条件进行计数

来自分类Dev

使用IF对行进行计数并按条件插入

来自分类Dev

使用多个条件对不同值进行计数

来自分类Dev

如何在WHERE子句中使用json列作为条件

来自分类Dev

ORA-01841在where子句中使用日期条件时出错

来自分类Dev

在where子句中使用AVG函数和DATEADD进行嵌套查询

来自分类Dev

如何在 where 子句中使用短名称进行过滤

来自分类Dev

在 where 子句中使用当前日期进行 Hive 选择查询

来自分类Dev

如何在 umbraco 8.1 中使用 where 子句中的自定义属性进行搜索

来自分类Dev

CASE子句中的计数条件

Related 相关文章

  1. 1

    在where子句中使用group by进行条件计数

  2. 2

    在WHERE子句中使用可选条件的正确方法

  3. 3

    在带有IN条件的where子句中使用CASE

  4. 4

    在where子句中使用多个条件的缺点

  5. 5

    可以在WHERE子句中使用集合,并以IN为条件?

  6. 6

    在 WHERE 子句中使用 AND 和 OR 条件得到错误的结果

  7. 7

    PostgreSQL:在函数中使用 where 子句中的条件

  8. 8

    在where子句中使用每个子查询在SQL Server中进行计数

  9. 9

    通过在where子句中使用术语进行排序

  10. 10

    在where子句中使用OR进行缓慢查询

  11. 11

    在where子句中使用OR条件和Null进行右外部联接-SQL SERVER

  12. 12

    如何使用解析计数进行条件计数?

  13. 13

    使用where子句中的计数条件选择行

  14. 14

    使用awk对条件进行计数

  15. 15

    如何在MySQL中使用GROUP BY和条件进行计数

  16. 16

    在MySQL中使用where条件对行进行计数

  17. 17

    SQL JOIN COUNT 然后在 where 子句中使用该计数值

  18. 18

    在WHERE子句中使用过滤条件和JOIN条件有什么区别

  19. 19

    使用多个条件对不同值进行计数

  20. 20

    使用sqldf根据多个条件进行计数

  21. 21

    使用IF对行进行计数并按条件插入

  22. 22

    使用多个条件对不同值进行计数

  23. 23

    如何在WHERE子句中使用json列作为条件

  24. 24

    ORA-01841在where子句中使用日期条件时出错

  25. 25

    在where子句中使用AVG函数和DATEADD进行嵌套查询

  26. 26

    如何在 where 子句中使用短名称进行过滤

  27. 27

    在 where 子句中使用当前日期进行 Hive 选择查询

  28. 28

    如何在 umbraco 8.1 中使用 where 子句中的自定义属性进行搜索

  29. 29

    CASE子句中的计数条件

热门标签

归档