sql - 根据连接表的另一列双重计算一列
问题描述
这在标题中很难解释,但我有一个列是一个连接表,我想根据书本来计算一个角色出现过type
的书本数。
所以如果cb.type = 2
,那么我想要count(cb.id) + 1
这是否有意义。否则,对于所有其他类型,只需正常计数即可count(cb.id)
。
SELECT
CASE
WHEN cb.type = 2 THEN count(cb.id) + 1
ELSE count(cb.id)
END AS book_count,
c.*
FROM characters c
INNER JOIN character_books cb ON cb.character_id = c.id
GROUP BY c.id, cb.type
ORDER BY book_count DESC
上面的查询不起作用,因为我必须分组c.id, cb.type
,所以我没有得到该角色出现的书籍总数。
现在不考虑cb.type
,查询将如下所示:
SELECT count(cb.id) AS book_count, c.*
FROM characters c
INNER JOIN character_books cb ON cb.character_id = c.id
GROUP BY c.id
ORDER BY book_count DESC
但是,如果该列cb.type = 2
(实际上是按位列,只是2
为了简单起见在这里使用数字),那么我们应该在book_count
.
我将如何做到这一点?
解决方案
您需要条件聚合。我想你想要:
SELECT c.id,
SUM(CASE cb.type = 2 THEN 2 ELSE 1 END) as book_count
FROM characters c INNER JOIN
character_books cb
ON cb.character_id = c.id
GROUP BY c.id
ORDER BY book_count DESC;
推荐阅读
- ios - 使用设备运动或手势识别 Swift 旋转 360 度全景图像
- yocto - BitBake 如何使用 B 和 SRC_URI 等变量?
- arrays - 如何将 API 响应数组字符串插入数据库
- django - Django Forms DateInput 小部件未填充
- google-cloud-platform - Stackdriver Monitoring 警报:我可以使用函数而不是常量作为条件阈值吗?
- javascript - 在猜数字游戏中进行猜测时如何编码您所做的猜测次数?
- php - 登录页面的准备语句问题
- java - 麻烦地定义一个 'bean' ,“考虑在你的配置中定义一个名为 'entityManagerFactory' 的 bean”
- javascript - 如何使用 vanilla javascript 使表单更新主表单上的文本?
- java - 网格停止在 10 x 50 而不是 50 x 50