SQL查询以按用户和日期返回项目总数

问题描述 投票:0回答:1

我有一个使用Postgresql的Express Api。

我目前使用以下查询来填充页首横幅:

SELECT acts.users_id, username, avatar_url, COUNT(acts.id)
FROM acts
    RIGHT JOIN users ON acts.users_id = users.id
    JOIN memberships on memberships.users_id = users.id
WHERE memberships.groups_id = ' + req.params.group_id + '
GROUP BY acts.users_id, username, avatar_url
ORDER BY COUNT(acts.id) DESC 

这将返回所有属于特定组的用户列表,每个用户按“行为”的数量降序列出。

我正在尝试修改此查询,使其仅包括最近(例如7天)内创建的行为。

我已经尝试过此修改后的查询:

SELECT acts.users_id, acts.created_at, username, avatar_url, COUNT(acts.id)
FROM acts
    RIGHT JOIN users ON acts.users_id = users.id
    JOIN memberships on memberships.users_id = users.id
WHERE memberships.groups_id = ' + req.params.group_id + '
    AND acts.created_at >= (CURRENT_DATE - 7)
GROUP BY acts.users_id, acts.created_at, username, avatar_url
ORDER BY COUNT(acts.id) DESC

此修改后的查询返回正确的数据,但它按日期分隔,因此我为每个用户获得多行,而不是按用户总计。我认为这是由于在group_by中包含了created_at。但是,如果删除它,则会出现错误:

error: column "acts.created_at" must appear in the GROUP BY clause or be used in an aggregate function
postgresql express
1个回答
0
投票
SELECT acts.users_id, username, avatar_url, COUNT(acts.id)
FROM acts
    RIGHT JOIN users ON acts.users_id = users.id
    JOIN memberships on memberships.users_id = users.id
WHERE memberships.groups_id = ' + req.params.group_id + '
    AND acts.created_at >= (CURRENT_DATE - 7)
GROUP BY acts.users_id, username, avatar_url
ORDER BY COUNT(acts.id) DESC

您无需按字段分组或选择要通过该字段过滤的字段。只需添加条件,就不要更改其他任何内容。

我想这就是@forpas的意思。

© www.soinside.com 2019 - 2024. All rights reserved.