2017-02-19 28 views
0

我有三个表与结构概述如下:多个选择连接的表与group by?

CREATE TABLE users (
    id   BIGSERIAL PRIMARY KEY, 
    username VARCHAR(255) UNIQUE 
); 
CREATE TABLE posts (
    id   BIGSERIAL PRIMARY KEY, 
    user_id  BIGINT REFERENCES users(id) NOT NULL, 
    category BIGINT REFERENCES categories(id) NOT NULL, 
    text  TEXT NOT NULL 
); 
CREATE TABLE posts_votes (
    user_id  BIGINT REFERENCES users(id) NOT NULL, 
    post_id  BIGINT REFERENCES posts(id) NOT NULL 
    value  SMALLINT NOT NULL, 
    PRIMARY KEY(user_id, post_id) 
); 

我能够编写一个查询,得到每个岗位,其用户和使用下面的查询其总价值:

SELECT p.id, p.text, u.username, COALESCE(SUM(v.value), 0) AS vote_value 
FROM posts p 
    LEFT JOIN posts_votes v ON p.id=t.post_id 
    JOIN users u ON p.user_id=u.id 
WHERE posts.category=1337 
GROUP BY p.id, p.text, u.username 

但现在我想返回一个列,返回上述查询中每个post_id n的结果SELECT COALESCE((SELECT value FROM posts_votes WHERE user_id=1234 AND post_id=n), 0)。什么是最好的方法来做到这一点?

+0

将价值为USER_ID = 1234和POST_ID独特= N? –

+0

'BIGSERIAL'建议Postgres,所以我删除了MySQL标签。 –

回答

1

我认为一个额外的LEFT JOIN是一种合理的方法:

SELECT p.id, p.text, u.username, COALESCE(SUM(v.value), 0) AS vote_value, 
     COALESCE(pv.value, 0) 
FROM posts p JOIN 
    users u 
    ON p.user_id=u.id LEFT JOIN 
    topics_votes v 
    ON p.id = t.post_id LEFT JOIN 
    post_votes pv 
    ON pv.user_id = 1234 AND pv.post_id = p.id 
WHERE p.category = 1337 
GROUP BY p.id, p.text, u.username, pv.value; 
+0

刚刚意识到我原来的帖子中有一个错字。如果我将'LEFT JOIN'连接到同一个表两次,这仍然是最好的方法吗? – jhhayashi

+0

@jhhayashi。 。 。可能是同样的方法。如果性能问题,您可能需要关注索引。 –