我有一个名为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?
来自Okham的William的引用适用于:
Enita non sunt multiplicanda praeter necessitatem
(拉丁语为"实体不得超越必要性").
您应该重新考虑为什么需要在单个查询中完成此操作? 确实,单个查询比多个查询具有更少的开销,但如果单个查询的性质变得太复杂,无论是开发还是要执行RDBMS,都要运行单独的查询.