Запрос данных для новостной ленты в стиле Facebook - PullRequest
0 голосов
/ 06 апреля 2009

У меня есть сайт социальной сети, где пользователи обновляют свое настроение, профили и добавляют фотографии.

В настоящее время я регистрирую все обновления в таблице с именем "update_log" со следующей структурой:

update_id int (auto), 
userid int, 
update_type int (1=profile, 2=photo, 3=mood)
pictureid int
mood_a int
mood_b int
mood_c int
update_time int

Запись обновления профиля: (авто), 1, 1, 0, 0, 0, 0, 1239003781

Запись обновления фотографии: (авто), 1, 2, 11544, 0, 0, 0, 1239003781

Запись обновления настроения: (авто), 1, 3, 0, 1, 490, 70, 1239003781

Для записи фотографий есть соответствующая таблица userphotos, в которой содержатся заголовок и имя файла / данные о местоположении

Для настроений есть таблица поиска настроения, в которой содержатся описания настроения (т. Е. Я ленивый = \)

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

Проблема, с которой я сталкиваюсь, заключается в том, что если пользователь загружает пять фотографий в течение получаса или чего-то еще, я просто хочу, чтобы это была одна строка в ленте, а не запись для каждой загрузки фотографий.

То же самое касается обновлений профиля.

Мне нужно запросить данные, чтобы пользователь увидел что-то вроде этого:

Пользователь x обновил свое настроение! (Я устал) 4 апреля 2009 г., 22:35
Пользователь y загрузил x новых фотографий 4 апреля 2009 г. 22:20
Пользователь x обновил свой профиль 4 апреля 2009 г. 10:15

Как сгруппировать обновления фотографий в одну запись, возвращаемую в запросе, основываясь на всех записях, скажем, в часе друг от друга?

Есть ли способ сделать это одним запросом?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 06 апреля 2009

Вы хотите что-то вроде

SELECT * FROM update_log WHERE update_time > NOW() - 30 MINUTES;

30 минут - это период времени, когда вы оглядываетесь назад.

Полагаю, вам просто нужно было узнать, как вернуть в одном запросе обновления за последние 30 минут.

Если вы пытаетесь сгруппировать все фотографии в 30-минутные блоки, скажем, за последние два дня, вам лучше изменить структуру базы данных и создать таблицу photo_group [содержащую первичный ключ, идентификатор пользователя, и время создания] и добавления столбца group_id в таблицу update_log.

При добавлении новой фотографии проверьте существующую группу, созданную этим пользователем за последние 30 минут.

<code>SELECT * FROM photo_group WHERE user_id = XXX AND created > NOW () - 30 MINUTES;

Если он не существует, создайте его. Свяжите фотографии с самыми новыми, добавив первичный ключ таблицы photo_group в качестве group_id в update_log.

Когда вы получите строки позже, вы можете сгруппировать их по group_id, используя ваш язык сценариев.

Недостатком этого метода является то, что структуру вашей группы будет сложно изменить позже, поскольку предыдущие записи будут сгруппированы по их старым группам при изменении правил создания новых групп.

Если вы хотите сделать это без сохранения групп, вам придется обрабатывать логику на вашем языке сценариев, группируя фотографии вместе в цикле, который проверяет время создания фотографии, группируя следующие фотографии в массив с это, если они были созданы в течение определенного периода времени, или перезапускает цикл, используя самую последнюю фотографию, которая не соответствует предыдущей. Это будет более затратно, чем добавление новой таблицы, но ее будет легче изменить позже.

0 голосов
/ 06 апреля 2009

Рассматривали ли вы попытки сделать это с помощью PHP, а не SQL-запросов? Может быть менее сложным запросить нужные результаты (все обновления между этими периодами), а затем использовать PHP для сравнения временных меток, чтобы определить, как они должны быть сгруппированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...