当前位置:  开发笔记 > 后端 > 正文

两个联接的聚合(MySQL)

如何解决《两个联接的聚合(MySQL)》经验,为你挑选了1个好方法。

我有一个名为gallery的表.对于图库中的每一行,表格图片中有几行.一张图片属于一个图库.然后是表投票.每一行都是某个画廊的upvote或downvote.这是(简化)结构:

gallery ( gallery_id )
picture ( picture_id, picture_gallery_ref )
vote ( vote_id, vote_value, vote_gallery_ref )

现在我想要一个查询给我以下信息:所有画廊都有自己的数据字段和连接到画廊的图片数量以及投票的sumarized值.

这是我的查询,但由于多次加入,聚合值不正确.(至少当图片或投票中有多行时.)

SELECT 
  *, SUM( vote_value ) as score, COUNT( picture_id ) AS pictures
FROM 
  gallery
LEFT JOIN 
  vote
  ON gallery_id = vote_gallery_ref
LEFT JOIN 
  picture
  ON gallery_id = picture_gallery_ref
GROUP BY gallery_id

因为我注意到这COUNT( DISTINCT picture_id )给了我正确数量的照片我试过这个:

( SUM( vote_value ) / GREATEST( COUNT( DISTINCT picture_id ), 1 ) ) AS score

它适用于此示例,但如果一个查询中有更多连接,该怎么办?

只是想知道是否有更好或更"优雅"的方式可以解决这个问题.另外我想知道我的解决方案是MySQL特定的还是标准的SQL?



1> Bill Karwin..:

来自Okham的William的引用适用于:

Enita non sunt multiplicanda praeter necessitatem

(拉丁语为"实体不得超越必要性").

您应该重新考虑为什么需要在单个查询中完成此操作? 确实,单个查询比多个查询具有更少的开销,但如果单个查询的性质变得太复杂,无论是开发还是要执行RDBMS,都要运行单独的查询.

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有