我有一个包含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次调用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 | GROUP_CONCAT(b.imagePath)
1 | 'title1' | path1,path2
2 | 'title2' | path3,path4,path5
3 | 'title3' | path6
这提供了我需要的所有信息。但查询需要0.25秒。考虑到我可能需要运行很多查询,我有点慢。
我们能做的最好吗?
答案 0 :(得分:0)
选项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;
<强>更新强>
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;
然后你的结果会是这样的:
ID | Title | Path
---+--------+------
1 | Title1 | /path1/
2 | Title2 | /path3/
如果这是你想要的......就这样做吧! ; - )