我目前有三个表:公式、视频和文章。公式表中的行与视频和文章有多对一的关系。
我的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);方法一对我来说很残忍,而方法二似乎分散成太多的查询。
有人能展示一种更好/更正确的方式来查询多个多对一的关系吗?
发布于 2016-02-14 17:58:41
这完全取决于你想对结果做些什么。没有一种“最好”的方法来做这样的事情。如果是报告,我就去找解决方案一。如果这是针对交互式GUI,用户首先选择一个公式,然后需要显示相关行,那么第二种方法可能更好。或者组合:一个查询获得公式,另一个查询得到所有相关的vidoes和文章。或者完全不同的东西。除非你告诉我们你需要对结果做什么,否则这几乎是不可能回答的。
https://stackoverflow.com/questions/32356208
复制相似问题