在PostgreSQL中查询多个多对一关系的正确方法?
我目前有三个表格:公式、视频和文章。公式表中的行与视频和文章具有多对一关系 我的API需要以以下形式输出此关系:在PostgreSQL中查询多个多对一关系的正确方法?,sql,postgresql,Sql,Postgresql,我目前有三个表格:公式、视频和文章。公式表中的行与视频和文章具有多对一关系 我的API需要以以下形式输出此关系: formulas: { // some number of formulas } videos: { // videos belonging to the formulas } articles: { // articles belonging to the formulas } 我想出了两种不同的方法来进行查询,以获得所需的信息,但我担心,由于我对SQL缺乏经验,这两
formulas: {
// some number of formulas
}
videos: {
// videos belonging to the formulas
}
articles: {
// articles belonging to the formulas
}
我想出了两种不同的方法来进行查询,以获得所需的信息,但我担心,由于我对SQL缺乏经验,这两种方法都不是好方法
方法一对我来说似乎是可怕的实践,但它在一个查询中就完成了这一切。但是,它还要求我对结果进行一些格式化:
SELECT formulas.formula_id,
formulas.formula,
formulas.name,
array_agg(videos.link) AS video_links,
array_agg(videos.name) AS video_names,
array_agg(articles.link) AS article_links,
array_agg(articles.name) AS article_names
FROM formulas LIMIT 200
LEFT JOIN videos on videos.formula_id=formulas.formula_id
LEFT JOIN articles on articles.formula_id=formulas.formula_id
GROUP BY formulas.formula_id;
方法二似乎更正常一些。它需要多个查询,这并不是世界末日,但据我所知,最好只在一个查询中执行:
SELECT * FROM formulas LIMIT 200;
SELECT * FROM videos WHERE formula_id IN (SELECT formula_id FROM formulas LIMIT 200);
SELECT * FROM articles WHERE formula_id IN (SELECT formula_id FROM formulas LIMIT 200);
方法一对我来说似乎很糟糕,而方法二似乎被分割成了太多的查询
有人能演示一种更好/更正确的查询多对一关系的方法吗?这完全取决于您想对结果做什么。没有单一的“最佳”方式来做这类事情。如果是为了一份报告,我会选择解决方案一。如果这是一个交互式GUI,用户首先选择一个公式,然后需要显示相关行,那么第二种方法可能更好。或者组合:一个查询获取公式,一个查询获取所有相关的视频和文章。或者完全不同的东西。除非您告诉我们您需要对结果做什么,否则这几乎是不可能回答的。不相关,但是:没有order by的
LIMIT
子句没有意义,因为它返回的值在每次执行之间可能不同。三条语句中的每一条都可能返回一组不同的formula\u id
s。另外:限制
应用于整个查询,而不是单个表<代码>来自公式限制200无效。@一匹没有名字的马谢谢你让我知道!如果你说不出我使用SQL的时间很短,那么我非常感谢这个建议;根据表的大小和结构,每个表都会有不同的性能问题。IMHO,这两种情况都不是“糟糕的”;请分析它们,看看在预期条件下哪个性能更好。另外,您可能希望在第一次查询中使用string\u agg
而不是array\u agg
。但这在很大程度上取决于你的编程语言和你需要对结果做什么,这完全取决于你想对结果做什么。没有单一的“最佳”方式来做这类事情。如果是为了一份报告,我会选择解决方案一。如果这是一个交互式GUI,用户首先选择一个公式,然后需要显示相关行,那么第二种方法可能更好。或者组合:一个查询获取公式,一个查询获取所有相关的视频和文章。或者完全不同的东西。除非你告诉我们你需要对结果做什么,否则这几乎是不可能回答的。