Mysql 避免一对多关系中出现多个查询的最佳方法
我有一个包含id、标题和其他内容的文章表 我有另一个表,其中包含每个文章的所有图像,称为imagePath,它存储图像的路径。它包含id、path、articleId等 每篇文章可以有许多图片 我想以最好的方式获取文章及其相关图片 备选案文1: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中的每个图像的项目行都是
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获取两行吗?好的,这个更新清楚地说明了您想要什么。如果查询性能有问题,请尝试分析它。有许多可能出现瓶颈的地方。检查索引、数据库连接等。