如何在 sqlite3 中正确连接这些表 [关闭]

Posted

技术标签:

【中文标题】如何在 sqlite3 中正确连接这些表 [关闭]【英文标题】:how to join these tables properly in sqlite3 [closed] 【发布时间】:2021-07-19 14:24:12 【问题描述】:

我有 3 张桌子。首先是 Posts 表,看起来像这样

id post_creator
1 Mark
2 John
3 David
4 Ellie
5 Thomas
6 Elliot

有两种类型的帖子。图片帖子和文字帖子。我为他们准备了 2 张不同的桌子。下面是 text_posts 表的样子:

post_id post_text
1 lorem ipsum
4 lorem ipsum
5 lorem ipsum

还有一个 image_posts 表,它们都遵循 post 表中的 id

post_id post_text post_image
2 lorem ipsum image_url
3 lorem ipsum image_url
6 lorem ipsum image_url

现在我不关心 post_image url,我想要的只是从 Post 表中获取 post_creator 以及 post,无论它是在 text_post 表还是 image_post 表中,我想要文本。我该怎么做?

【问题讨论】:

或许你可以从UNION语句中获得灵感,它可以将两个查询合并为一个。 【参考方案1】:

我假设您使用的是 SQL Db。

在这种情况下,Posts 和 post_text/image_posts 是 NtoN 关系,因此您应该将关系规范化为 2 1toN。 在这种情况下,它以 1 个表 Post、2 个表:Post_text 和 Post_img 以及另一个维护每个用户的帖子“历史记录”的表结束。 您应该创建另一个名为 Creates(id, user_id, post_id) 的表。

然后就可以加入2表,获取post_creator了。

SELECT 
     post_id, post_text, post_image
FROM Posts 
     LEFT JOIN text_posts ON text_posts.post_id = Posts.id
     LEFT JOIN image_posts ON image_posts.post_id = Posts.id

然后您将获得一个表格,其中包含表格的所有字段作为结果。要了解帖子是否为图像,只需检查 post_image 字段。如果它是 != null 那么它将是一个 image_post。

但是,您使用的结构非常糟糕,我建议您更好地研究如何构建 SQL 表和 Db,并尝试按照规范化规则以更好的方式重新构建您的数据。

【讨论】:

到目前为止我只做前端的东西,对 db 很陌生,所以我还不明白这是如何工作的,非常感谢您的建议。

以上是关于如何在 sqlite3 中正确连接这些表 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3 数据库创建表

sqlite3 内连接比较所有列

如何使用 Sequelize.js ORM 正确迁移 sqlite3 数据库?

在 Visual Studios 中创建 sqlite3.lib 文件/使用 sqlite3 [关闭]

Mysql 行计数为连接表返回不正确的值[关闭]

如何显示 Java SQLite3 数据库中存在的表名? [复制]