【问题标题】:SQL: How to design a basic vote system schemaSQL:如何设计一个基本的投票系统架构
【发布时间】:2020-10-02 20:35:45
【问题描述】:

到目前为止,我已经创建了这些表

CREATE TABLE IF NOT EXISTS users (
    user_id serial PRIMARY KEY,
    email varchar(50) NOT NULL,
    username varchar(50) NOT NULL,
    user_password varchar(255) NOT NULL,
    moderator boolean NOT NULL
);

CREATE TABLE IF NOT EXISTS post (
    post_id serial PRIMARY KEY,
    user_id integer NOT NULL,
    post_data bytea NOT NULL,
    date timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users (user_id)
);

CREATE TABLE IF NOT EXISTS vote (
    user_id integer NOT NULL,
    post_id integer NOT NULL,
    vote_value integer DEFAULT 1,
    FOREIGN KEY (user_id) REFERENCES users (user_id) ON DELETE CASCADE,
    FOREIGN KEY (post_id) REFERENCES post (post_id) ON DELETE CASCADE,
    PRIMARY KEY (user_id, post_id)
);

我最终希望能够在一次查询中获得特定帖子的用户名、帖子数据、日期、帖子 ID 和投票数。到目前为止,我已经能够想出以下内容,这些信息可以让我获得每个帖子的帖子 ID、帖子日期、帖子数据以及提交它的用户,但我也在努力获得该特定帖子的总票数另一列。

SELECT users.username, post.post_data, post.date, post.post_id
FROM users 
INNER JOIN post ON post.user_id = users.user_id
ORDER BY post.date DESC

如果这种方法看起来有缺陷,我也愿意接受更好的整体数据库设计

【问题讨论】:

  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入作为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表的代码的 SQL。 How to Ask 当卡住时,请解释您可以编写的查询可以做什么以及它们与您的目标有何关系。

标签: sql database postgresql join count


【解决方案1】:

您可以使用从votes 表中检索投票计数的相关子查询。我不确定vote_value 列的含义是什么,但我认为应该是:

SELECT 
    u.username, 
    p.post_data, 
    p.date, 
    p.post_id,
    (SELECT SUM(vote_value) FROM votes v WHERE v.post_id = p.post_id) no_votes
FROM users u
INNER JOIN post p ON p.user_id = u.user_id
ORDER BY p.date DESC

注意表别名的使用,这使查询更易于读写。

【讨论】:

  • 啊,我的意思是 vote_value 要么是“upvote”,要么是“downvote”,这就是我想要做的,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多