【发布时间】: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