【发布时间】:2019-07-15 23:56:21
【问题描述】:
我有两张桌子
- 杂志与字段id, name;
- Subscriptions 包含字段 subscriber_id 和 magazine_id,它们是来自 Magazines 和另一个订阅者表的外键。
我想将 Magazines 表扩展为:
- 第三列列出其订阅者和 的总数
- 第四列 subscribed 有一个布尔值,如果 Subscriptions 中存在一条记录,且我的subscriber_id 为真(我们可以说我是 subscriber_id=1 )。
是否有解决这些问题的规范方法?如果没有,我怎样才能有效地做到这一点?
要获得订阅者列,我想到的最简单的方法是不列出没有订阅者的杂志。 (我确实读过here,但看不出它是如何相关的)
SELECT magazine_id, COUNT(*)
FROM subscriptions GROUP BY magazine_id
ORDER BY magazine_id ASC;
所以我做了一些有点老套而且可能效率低下的事情:
SELECT
magazines.id,
CASE WHEN NOT EXISTS(
SELECT * FROM subscriptions WHERE magazines.id=magazine_id
) THEN 0
ELSE COUNT(*) END AS subscribers
FROM
magazines
LEFT JOIN
subscriptions
ON
magazines.id = subscriptions.magazine_id
GROUP BY
magazines.id
ORDER BY
magazines.id ASC;
对于布尔型第四列,我得到了一个解决方案,方法是再次将先前的结果与订阅一起左连接,并为subscriber_id 的值做 case when is null。
我正在使用 PostgreSQL。我不是学生,但我想学习如何解决这个问题,杂志/订阅者只是一个例子。我只知道 SQL 的基础知识。
【问题讨论】:
标签: sql aggregate-functions rdbms query-performance sqlperformance