在一对多关系中避免许多查询的最佳方法

时间:2011-10-29 07:52:40

标签: mysql join duplicates one-to-many

我有一个包含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秒。考虑到我可能需要运行很多查询,我有点慢。

我们能做的最好吗?

1 个答案:

答案 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/

如果这是你想要的......就这样做吧! ; - )