我正在尝试检索属性列表,为此我必须将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
有人能指出我正确的方向吗?有一点需要注意,我正在进入这个已经完成的项目。因此,此时无法更改数据库结构。
答案 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记录。