2010-08-22 3 views
0

J'essaie de récupérer une liste de propriétés et pour ce faire, je dois relier 4 tables. Les tables sont: property, property_type, state et photo.Obtenir uniquement l'image par défaut pour une propriété

Le problème consiste à obtenir SEULEMENT l'image par défaut pour une propriété. La photo avec le numéro de rang le plus bas devrait être la photo par défaut. Donc, s'il y a 2 photos pour la propriété 10, celle avec la valeur de rang inférieure devrait être dans cet ensemble de résultats. Jetez un oeil à ce que j'ai jusqu'à présent, il devrait expliquer ce que j'ai fait jusqu'à présent. Fondamentalement, il montre une liste de propriétés, y compris un identifiant de photo attribué à cette propriété. Malheureusement, puisque j'utilise GROUP BY pour éliminer les résultats supplémentaires (ne pas avoir besoin de 5 lignes pour une propriété si 5 photos lui sont assignées), commander par classement photo ne change pas mes résultats comme je le pensais.

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 

Est-ce que quelqu'un peut me diriger dans la bonne direction? Une chose à noter, je viens dans ce projet qui est déjà terminé. La structure de la base de données ne peut donc pas être modifiée à ce stade.

Répondre

2

Utilisation:

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 

je modifier votre requête pour faire une auto-jointure à une copie de la table PHOTO, pour obtenir le rang minimum par valeur property_id. En revenant à la table PHOTO, je peux m'assurer que seul l'enregistrement PHOTO le moins bien classé est retourné.

+0

Uhm .. y a-t-il une syntaxe err sur "ON x.property_id"? Upvoted 'parce que l'approche est la bonne. – Radu094

+0

@ Radu094: Thx, corrigé. Je faisais trop attention aux trucs PHOTOS :) –

+0

merci! cela fonctionne parfaitement. – Roeland

Questions connexes