0

此处查询的目标已被简化,但它代表了一个复杂的目标,我想从子查询中选择所有用户字段并计算 SUM。所以,这只是一个例子。

由于 SUM 重复行的问题,我正在执行子查询。喜欢建议使用此答案:https ://stackoverflow.com/a/7351991/255932

但问题是子查询还从表评级中选择一个列“评级”,除非描述父选择上的所有用户列,否则我无法选择所有用户字段。

SELECT id, name, x, y, z ..., SUM(rating)

FROM
   (SELECT users.*, ratings.rating
    FROM users
    INNER JOIN ratings ON
    users.id = ratings.user_id
   )

GROUP BY users.id

我想知道是否有办法(id, name, x, y, z, ...)用简单的(users.*).

4

2 回答 2

2

实际上,有两种非常简单的方法。

如果users.id主键

SELECT u.*, sum(r.rating) AS total
FROM   users   u
JOIN   ratings r ON r.user_id = u.id
GROUP  BY u.id;

您需要 Postgres 9.1 或更高版本才能正常工作。这个密切相关的答案中的详细信息:
PostgreSQL - GROUP BY 子句

如果users.id至少是唯一的

SELECT u.*, r.total
FROM   users u
JOIN  (
   SELECT user_id, sum(rating) AS total
   FROM   ratings
   GROUP  BY 1
    ) r ON r.user_id = u.id;

适用于我知道的任何版本。在检索整个表或大部分表时,通常先分组再加入会更快。

于 2013-11-19T05:10:01.447 回答
1

有点,但不是真的。有一种解决方法,但您必须以不同的方式处理子查询。

SELECT (c.users).*, SUM(c.rating)

FROM
   (SELECT users, ratings.rating
    FROM users
    INNER JOIN ratings ON
    users.id = ratings.user_id
   ) c

GROUP BY c.users;
于 2013-11-19T04:05:31.743 回答