2011-02-17 5 views
2

J'ai une table d'images et une table d'emplacements Je souhaite récupérer une liste d'images représentant les images les plus récentes pour chaque emplacement dans certaines limites.Requête SQL imbriquée

SELECT * FROM images 
    WHERE location_id IN 
     (SELECT id FROM locations 
      WHERE latitude > 17.954 AND latitude < 52.574 
      AND longitude > -107.392 AND longitude < -64.853) 

Ceci est une requête imbriquée, mais nous pourrions obtenir la même chose avec une jointure. Cela fonctionne si nous voulons que toutes les images pour chaque emplacement, mais je voudrais seulement obtenir 1 image par emplacement (la plus récente)

Voici les principaux champs de ces tables

table "images" 
    integer "id" 
    text  "image_name" 
    text  "caption" 
    integer "location_id" 
    datetime "created_at" 
    datetime "updated_at" 
    integer "view_count" 

    table "locations" 
    integer "id" 
    text  "name" 
    float "longitude" 
    float "latitude" 
    datetime "created_at" 
    datetime "updated_at" 
    string "city" 
    string "address" 
    string "province" 
    string "country" 
    string "post_code" 

tout idée?

points de bonus s'il y a un moyen de le faire en utilisant l'API rails activerecord

+0

@ standup75 J'ai modifié votre question clarifier, selon vos commentaires, mais je n'ai pas le temps de réécrire la réponse maintenant. Bonne chance. –

+0

Y a-t-il une colonne dans les images de la table qui indique la date et l'heure auxquelles l'image a été ajoutée/créée? Sinon, comment détermine-t-on à quel point une image est récente? – rskar

+0

Oui, c'est "created_at" – standup75

Répondre

0

Vous aurez besoin d'utiliser des alias et l'agrégation dans une sous-requête.

SELECT * FROM images IMG 
    WHERE location_id IN 
     (SELECT id FROM locations 
      WHERE latitude > 17.954 AND latitude < 52.574 
      AND longitude > -107.392 AND longitude < -64.853) 
    AND created_at IN 
     (SELECT MAX(created_at) FROM images IMG2 
       WHERE IMG2.location_id=IMG.location_id) 
+0

En utilisant ActiveRecord j'ai trouvé: Image.where (: location_id => Location.where ("latitude>? ET latitude ? ET longitude Image.group (: location_id) .maximum (: created_at) .values) – standup75

0
SELECT * 
FROM Images I  
INNER JOIN Location L On L.Id = I.Location_ID 
WHERE (L.latitude Between 17.954 And 52.574)    
    AND (L.longitude Between -107.392 And -64.853) 

Vous devez utiliser Top 1 Trier par date desc, Incase vous avez 2 dates dans le même endroit avec la même date Mise à jour

SELECT * 
FROM Images I  
INNER JOIN Location L On L.Id = I.Location_ID 
WHERE (L.latitude Between 17.954 And 52.574)    
    AND (L.longitude Between -107.392 And -64.853) 
    AND I.Id = 
     (
      SELECT Top 1 I2.Id 
      FROM Images I2 
      WHERE I2.Location_Id = L.Id 
      ORDER BY Updated_At DESC 
     )