sql—按表中一列的所有值分组,并使用另一个表的平均值错误:from子句

gpnt7bae  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(347)

我正在尝试检索每个主url的平均分数。但是,每个分数都由一个post\u id标识,并且每个post都与一个主\u url相关联。
但是,我收到一个奇怪的错误消息:

ERROR:  missing FROM-clause entry for table "post"
LINE 1: ..._url_id LEFT JOIN score c ON b.post_id = c.post....
                                                    ^

我不明白,因为我有from子句。我编写的所有其他左连接查询只需要一个from子句。
“total”值在score表中。
我的问题是:

`
SELECT main_url, AVG(total)
FROM main_url a 
LEFT JOIN post b ON a.main_url_id = b.main_url_id
LEFT JOIN score c ON b.post_id = c.post.id
GROUP BY main_url
`

以下是表格:

CREATE TABLE main_url(
    main_url_id   SERIAL PRIMARY KEY,
    main_url      VARCHAR(2100)
);

CREATE TABLE post(
    post_id       SERIAL PRIMARY KEY,
    post_title    VARCHAR (2100),
    author_id     INTEGER,
    post_url      VARCHAR(2100),
    main_url_id   INTEGER 
);

CREATE TABLE score(
    score_id    SERIAL PRIMARY KEY,
    detail      INTEGER,
    prose       INTEGER,
    s_g         INTEGER,
    like_it     INTEGER,
    total       INTEGER,
    post_id     INTEGER,
    account_id  INTEGER
);
aamkag61

aamkag611#

假设 main_url 是唯一的,我建议按id聚合,而不是按url本身聚合--这样应该效率更高。
另外,使用表中的别名缩写,而不是任意字母。并限定所有列引用。所以:

SELECT mu.main_url, AVG(s.total)
FROM main_url mu LEFT JOIN
     post p
     ON p.main_url_id = mu.main_url_id LEFT JOIN
     score s
     ON s.post_id = p.post.id
GROUP BY  mu.main_url_id;

如果 main_url 不是唯一的,那么在 main_url ,则需要按该列进行聚合。但是,如果可以避免在最多包含数千个字符的字符串上进行聚合,则最好避免使用它。

vatpfxk5

vatpfxk52#

你需要用c.post\u id加入

SELECT main_url, AVG(total)
FROM main_url a 
LEFT JOIN post b ON a.main_url_id = b.main_url_id
LEFT JOIN score c ON b.post_id = c.post_id
GROUP BY main_url

相关问题