仅获取属性的默认图像

时间:2010-08-22 19:05:08

标签: sql mysql greatest-n-per-group

我正在尝试检索属性列表,为此我必须将4个表绑定在一起。表格是:property,property_type,state和photo。

问题是只获取属性的默认图像。排名最低的照片应该是默认值。因此,如果属性10有2张照片,那么排名较低的照片应该在此结果集中。

看看我到目前为止的情况,它应该解释我到目前为止所做的事情。基本上它显示了一个属性列表,包括分配给该属性的照片ID。不幸的是,因为我使用GROUP BY来消除额外的结果(如果分配了5张照片,则不需要为一个属性设置5行),按照照片等级排序并不会像我想象的那样改变我的结果。

SELECT 
 property.property_id,
 property.property_name,
 state.state_id,
 state.state_name,
 photo.photo_id,
 photo.rank
FROM property 
JOIN photo
 ON property.property_id = photo.property_id
JOIN property_type
 ON property.property_type_id = property_type.property_type_id
JOIN state
 ON property.state_id = state.state_id    
GROUP BY property.property_id
ORDER BY  
 state.state_name ASC,
 property.property_name ASC,
 photo.rank ASC

有人能指出我正确的方向吗?有一点需要注意,我正在进入这个已经完成的项目。因此,此时无法更改数据库结构。

1 个答案:

答案 0 :(得分:2)

使用:

  SELECT p.property_id,
         p.property_name,
         s.state_id,
         s.state_name,
         x.photo_id,
         x.rank
    FROM PROPERTY p
    JOIN PHOTO x ON x.property_id = p.property_id
    JOIN (SELECT ph.property_id,
                 MIN(ph.rank) AS min_rank
            FROM PHOTO ph
        GROUP BY ph.property_id) y ON y.property_id = x.property_id
                                  AND y.min_rank = x.rank
    JOIN PROPERTY_TYPE pt ON pt.property_type_id = p.property_type_id
    JOIN STATE s ON s.state_id = p.state_id   
GROUP BY p.property_id
ORDER BY s.state_name, p.property_name

我更改了您的查询,以自我加入PHOTO表的副本,以获得每个property_id值的最低排名。通过加入PHOTO表,我可以确保只返回排名最低的PHOTO记录。