Mysql 避免一对多关系中出现多个查询的最佳方法

Mysql 避免一对多关系中出现多个查询的最佳方法,mysql,join,duplicates,one-to-many,Mysql,Join,Duplicates,One To Many,我有一个包含id、标题和其他内容的文章表 我有另一个表,其中包含每个文章的所有图像,称为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中的每个图像的项目行都是

我有一个包含id、标题和其他内容的文章表

我有另一个表,其中包含每个文章的所有图像,称为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个对imagepath表的调用

你会怎么做

**更新**

像这样使用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  | Path
 ---+--------+------
  1 | Title1 | /path1/
  2 | Title2 | /path3/
结果:

id  |     title |   GROUP_CONCAT(b.imagePath)

1   |   'title1'    |   path1,path2
2   |   'title2'    |   path3,path4,path5
3   |   'title3'    |   path6   
这提供了我需要的所有信息。但是查询需要0.25秒。考虑到可能需要运行许多查询,我的速度有点慢


是我们能做的最好的吗?

选项1不会给您重复的结果-仅当您的表中已经有重复的数据时。它为每个a.标题提供了不止一个b.路径,但仅此而已

例如:

 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;
更新:

Ofc您可以按Id对其进行分组:

 SELECT a.id, a.title, b.path 
 FROM articles a
 INNER JOIN imagepaths b ON a.id = b.articleId
 GROUP BY a.id;
但结果如下所示:

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  | Path
 ---+--------+------
  1 | Title1 | /path1/
  2 | Title2 | /path3/

如果这是你想要的。。。就这么做吧!;-)

许多优化的可缓存查询比一个较慢的较大查询要好。您确定这真的是个问题吗?优化的第一条规则是,你不知道为什么你的应用程序很慢。我会选择我认为最好的选项,编写代码,然后如果性能是一个问题,我会使用评测来确定如何加快速度。谢谢Bjoern。这正是我得到的。ID | Title | Path---+------------1 | Title1 |/path1/1 | Title1 |/path2/2 | Title2 |/path3/2 | Title2 |/path4/cont。。。避免结果中重复ID和标题的任何方法。Article表还包含许多其他列,当我运行此查询时,所有这8列将返回两次,只有最后一列用于路径更改。我可以避免为一个ID获取两行吗?好的,这个更新清楚地说明了您想要什么。如果查询性能有问题,请尝试分析它。有许多可能出现瓶颈的地方。检查索引、数据库连接等。