Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PostgreSQL中查询多个多对一关系的正确方法?_Sql_Postgresql - Fatal编程技术网

在PostgreSQL中查询多个多对一关系的正确方法?

在PostgreSQL中查询多个多对一关系的正确方法?,sql,postgresql,Sql,Postgresql,我目前有三个表格:公式、视频和文章。公式表中的行与视频和文章具有多对一关系 我的API需要以以下形式输出此关系: formulas: { // some number of formulas } videos: { // videos belonging to the formulas } articles: { // articles belonging to the formulas } 我想出了两种不同的方法来进行查询,以获得所需的信息,但我担心,由于我对SQL缺乏经验,这两

我目前有三个表格:公式、视频和文章。公式表中的行与视频和文章具有多对一关系

我的API需要以以下形式输出此关系:

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,用户首先选择一个公式,然后需要显示相关行,那么第二种方法可能更好。或者组合:一个查询获取公式,一个查询获取所有相关的视频和文章。或者完全不同的东西。除非你告诉我们你需要对结果做什么,否则这几乎是不可能回答的。