2010-05-18 2 views
1

К короткой версии этого вопроса является то, что я хочу выполнить что-то в соответствии с тем, что видно на домашней странице Flickr, когда вы вошли в систему. Он показывает три последних фотографии каждого из них ваших друзей, отсортированных по дате, но сгруппированных друг другу.SQL Последние фотографии из контактов (сгруппированы по контактам)

Вот более подробное объяснение: например, у меня 3 друзей: Джон, Джордж и Андреа. Список, который я хочу, чтобы извлечь должен выглядеть следующим образом:

Джорджу

  • Фото - 2010-05-18
  • Фото - 2010-05-18
  • Фото - 2010-05-12

Джон

  • Фото - 2010-05-17
  • Фото - 2010-05-14
  • Фото - 2010-05-12

Andrea

  • Фото - 2010-05-15
  • Фото - 2010-05-15
  • Фото - 2010-05-15

Друг с самой последней загруженной фотографией находится на вершине bu После этого следуют следующие 2 следующих файла.

Я хотел бы сделать это с MySQL, и на некоторое время я получил здесь:

SELECT photos.user_id, photos.id, photos.date_uploaded 
FROM photos 
WHERE photos.user_id IN (SELECT user2_id 
         FROM user_relations 
         WHERE user1_id = 8) 
ORDER BY date_uploaded DESC 

Где user1_id = 8 находится в настоящее время вошли в систему пользователя и user2_id являются идентификаторами друзей. Этот запрос действительно возвращает последние файлы, загруженные контактами пользователя с id = 8, отсортированными по дате. Однако я хотел бы выполнить описанную выше группировку и ограничение.

Надеюсь, это имеет смысл. Заранее спасибо.

+0

Допустимо ли, если вместо трех рядов на одного друга вы получаете три столбца на одного друга, в каждом столбце содержится одна фотография? –

+0

Не совсем. Вы имели в виду GROUP_CONCAT? – janosrusiczki

+0

Нет, но я думаю, что его можно иметь такую ​​строку, как 'userid: 1, photo1_id: 200, photo1_date: 2009-10-01, photo2_id: 167, photo2_date: 2009-08-01, photo3_id: 120, photo3_date: 2009 -06-01'. Аналогичные строки для каждого друга. –

ответ

3

Иногда единственный способ для того чтобы достигнуть конца, чтобы создать кусок SQL настолько уродливого и отвратительного, что альтернатива делать несколько запросов становится привлекательным :-)

Я просто один запрос, чтобы получить список ваших друзей, затем, для каждого друга, получите три последних фотографии. Что-то вроде:

friend_list = sqlexec "select user2_id from relations where user1_id = " 
         + current_user_id 
photolist = [] 
for friend in friend_list: 
    photolist += sqlexec "select user_id, id, date_uploaded from photos" 
       + " where user_id = " 
       + friend.get("user2_id") 
       + " order by date_uploaded desc fetch first 3 rows only" 

# Now do something with photolist 

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

+1

И затем вы сортируете результирующий массив/хэш по дате верхней фотографии. – janosrusiczki

+1

+1 ... некоторые вещи просто должны быть отформатированы в коде, SQL не должен быть полностью общим. – Donnie