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

时间:2015-09-02 14:40:46

标签: sql postgresql

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

我的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);

方法一对我来说似乎很残酷,而方法二似乎分散为太多的查询。

有人可以展示一种更好/更正确的方式来查询多个多对一关系吗?

1 个答案:

答案 0 :(得分:0)

这完全取决于你想对结果做些什么。没有单一的“最佳”方式来做这种事情。如果是报告,我会选择解决方案。如果这是用于交互式GUI,其中用户首先选择一个公式,然后您需要显示相关的行,第二种方法可能更好。或者组合:一个查询获取公式,一个获取所有相关的视频和文章。或者完全不同的东西。除非您告诉我们您需要对结果做什么,否则几乎无法回答。