case 是 ANSI sql 标准语法,其功能很强大,但利用它的人却很少,我们对此感到很惊讶。
-- PostgresSQL 即学即用
如上, case 语法十分强大,但是知道的人却很少。
重点: 我们现在有一张表,阅读记录表,记录了一个文章,被哪些人读过,如何得知,一篇文章的阅读量以及用户自己是否读过。
article_id | reader_id |
---|---|
1 | 张三 |
1 | 李四 |
1 | 王五 |
2 | 张三 |
2 | 李四 |
3 | 张三 |
4 | 张三 |
最简单的办法,两次查询
select article_id ,count(reader_id) from article_log group by article_id
select article_id from article_log where reader_id = '李四'
再通过程序内计算,就可以拼出结果了。
但是,如果想通过sql 一次性查出来要怎么做?
- 可以利用子查询。
- 可以利用 mysql的group concat + locate 。
这两种方法不在本文的讨论范围。
介绍下 case 的用法
select
article_id ,
count(reader_id) ,
count(case when reader_id='李四' then 1 else NULL end) as ownerRead
from
article_log group by article_id
注意, else null。这里利用了 count的时候,空值不会算入行数的特性。
如果 使用的是postgresSQL 有更方便的解决方案。
pgsql支持数组类型字段,可以将已读用户已数组形式存在数据库中,如
|:-|-:|
|1|{张三,李四,王五}|
|2|{张三,李四}|
|3|{张三}|
|4|{张三}|
那就更简单了,查询的时候只需要顺便得知数组的长度,再对数组进行包含性检查,检查数组是否包含 李四 ,就可以得到最后结果了。
网友评论