【问题标题】:Best way to avoid many queries in one-to-many relationship避免一对多关系中的许多查询的最佳方法
【发布时间】:2011-12-17 18:28:19
【问题描述】:

我有一个文章表,其中包含 id、title 等。

我有另一个表,其中包含每篇文章的所有图像,称为 imagePath,它存储图像的路径。它包含 id、path、articleId 等。

每篇文章可以有很多张图片。

我想以尽可能好的方式获取文章及其相关图像。

选项1:

SELECT a.id,a.title,b.path 
FROM articles a, imagepaths b
WHERE a.id=b.articleId 
LIMIT 10;

问题:这会产生重复的结果。 imagepath 中每张图片的文章行都是重复的

选项2:

SELECT * 
FROM imagepath 
WHERE articleId='111111'

但这必须针对每张图片进行。我有页面显示数百篇文章的文章摘要。假设 100 篇文章每篇有 2 张图片,这将需要 1 次调用文章表和 200 次调用图像路径表。

你会怎么做?

**更新**

像这样使用 GROUP_CONCAT() 怎么样:

select a.id,a.title,GROUP_CONCAT(b.imagePath) from articles a
inner join imagePaths b on a.id=b.unique_id
group by a.id limit 3

结果:

id  |     title |   GROUP_CONCAT(b.imagePath)

1   |   'title1'    |   path1,path2
2   |   'title2'    |   path3,path4,path5
3   |   'title3'    |   path6   

这提供了我需要的所有信息。但是查询需要0.25s。考虑到我可能必须运行许多查询,我有点慢。

我们能做到最好吗?

【问题讨论】:

  • 许多优化的可缓存查询比一个缓慢的大查询要好。
  • 你确定这真的是个问题吗?优化的第一条规则是你不知道为什么你的应用程序很慢。我会选择我认为最好的选项,编写代码,然后如果性能是一个问题,我会使用分析来确定如何加快速度。

标签: mysql join duplicates one-to-many


【解决方案1】:

选项 1 不会为您提供重复的结果 - 仅当您的表中已有重复数据时。它为每个 a.title 提供了多个 b.path,但仅此而已。

例如:

 articles:            imagepaths:

 ID | Title           articleId | Path
 ---+--------         ----------+-------------
  1 | Title1                 1  | /path1/
  2 | Title2                 1  | /path2/
                             2  | /path3/
                             2  | /path4/

...会给你这个结果:

 ID | Title  | Path
 ---+--------+------
  1 | Title1 | /path1/
  1 | Title1 | /path2/
  2 | Title2 | /path3/
  2 | Title2 | /path4/

在大多数情况下,选项 1 是我会这样做的方式。我会以这种方式重新格式化查询:

 SELECT a.id, a.title, b.path 
 FROM articles a
 INNER JOIN imagepaths b ON a.id = b.articleId
 LIMIT 10;

更新:

你可以按 Id 分组:

 SELECT a.id, a.title, b.path 
 FROM articles a
 INNER JOIN imagepaths b ON a.id = b.articleId
 GROUP BY a.id;

但是你的结果会是这样的:

 ID | Title  | Path
 ---+--------+------
  1 | Title1 | /path1/
  2 | Title2 | /path3/

如果这是你想要的……就去做吧! ;-)

【讨论】:

  • 谢谢比约恩。这正是我得到的。身份证 |标题 |路径---+--------+------ 1 |标题1 | /path1/ 1 |标题1 | /path2/ 2 |标题2 | /path3/ 2 |标题2 | /path4/
  • cont... 任何避免结果中重复 ID 和 Title 的方法。文章表还包含许多其他列,当我运行此查询时,所有这 8 列都会返回两次,只有最后一列用于路径更改。我可以避免为 1 个 ID 获得 2 行吗?
  • 好的,这次更新让你清楚你想要什么。如果您的查询性能有问题,请尝试对其进行分析。存在瓶颈的可能性有很多。检查您的索引、数据库连接等。
猜你喜欢
  • 2016-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2016-11-22
相关资源
最近更新 更多