Вложенный запрос SQL - PullRequest
       19

Вложенный запрос SQL

2 голосов
/ 17 февраля 2011

У меня есть таблица изображений и таблица местоположений Я хочу получить список изображений, которые являются последними изображениями для каждого местоположения в определенных границах.

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)

Это с вложенным запросом, но мы могли бы достичь того же с помощью соединения. Это работает, если нам нужны все изображения для каждого местоположения, но я хотел бы получить только 1 изображение для местоположения (самое последнее)

Вот основные поля этих таблиц

  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"

есть идеи?

Бонусные баллы, если есть способ сделать это с помощью rails activerecord API

Ответы [ 2 ]

0 голосов
/ 17 февраля 2011
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)

Вы должны использовать Top 1 Ordering к вашей дате desc, если у вас есть 2 даты в одном месте с той же датой обновления

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
        )
0 голосов
/ 17 февраля 2011

Вам потребуется использовать псевдонимы и агрегирование в подзапросе.

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)
...