Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод записей (аналог стены вконтакте, MySQL) 
:(
    Опции темы
fenec
Дата 20.7.2011, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 20.7.2011

Репутация: нет
Всего: нет



Всем привет!

Работаю на проекте социальной сети, делаем с нуля. Необходимо найти оптимальное (наиболее быстрое и простое) решение для вывода сообщений, комментариев к ним, прикреплений (фотки, ссылки и тп) и голосов за сообщения и комментарии. 
Сейчас все выводится в цикле вот так:

Код

 foreach ($messages as $message) {
     $message->getComments();
      ...
  }

аналогично получаются прикрепления, фотки и тп. решение простое, но запросы идут в цикле, что увеличивает их количество в несоклько раз (хотя они и небольшие).

есть такой вариант:
  
Код

      $arr = array();
        foreach ($messages as $message) {
            $arr[$message->id] = $message->as_array();
            $arr[$message->id]['comment'] = array();
            foreach ($comments as $comment) {
                if ($comment->message_id == $message->id) {
                    $arr[$message->id]['comment'][$comment->id] = $comment->as_array();
                }
            }


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

наверное, можно на уровне sql сделать, но наверное там запрос совсем дикий получится.

Кто что посоветует? Как вообще это делается в социалках? (я смотрел socialEngine - там первый вариант)


Это сообщение отредактировал(а) fenec - 20.7.2011, 17:23
PM MAIL   Вверх
triclosan
Дата 20.7.2011, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



Цитата(fenec @  20.7.2011,  17:08 Найти цитируемый пост)
решение для вывода сообщений, комментариев к ним, прикреплений (фотки, ссылки и тп) и голосов за сообщения и комментарии. 

струкутру табличек приведите пожалуйста


PM MAIL   Вверх
fenec
Дата 20.7.2011, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 20.7.2011

Репутация: нет
Всего: нет



Код

messages
id    text    user_id
--
comments
id parent_id parent_class oid user_id text
--
likes - голосование
id    user_id    resource_type    resource_id
-- 
message_references
id    message_id  reference_id type


PM MAIL   Вверх
triclosan
Дата 20.7.2011, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 1
Всего: 12



а кто где?

вообщем можно получить "простыню" одним запросом при помощи left join`ов например, потом эту простыню выводить в нужном порядке средствами php.
PM MAIL   Вверх
fenec
Дата 20.7.2011, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 20.7.2011

Репутация: нет
Всего: нет



JOINами получится огромный запрос тк нужно еще получать инфу о пользователе, который оставил сообщение, комментарий или голос. Но вообще согласен, сам склоняюсь к этому варианту как наиболее быстрому.
PM MAIL   Вверх
patap
Дата 22.7.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 893
Регистрация: 7.5.2005
Где: Украина, Зп

Репутация: 3
Всего: 40



интересный вопрос...

я сейчас подобную задачу решаю.

Сразу введу договоренность: 
 - один раз на страницу выводится n сообщений
 - предполагается, что сообщения должны выводиться в порядке, зависящем от даты комментария относящегося к сообщению. Т.е. последнее прокомментированное сообщение должно быть первым. 
 - Также к каждому сообщению нужно выводить три последних коммента.

немного таблицы изменил (т.к. не пойму что занчат некоторые поля)
Код

[messages]
id    text    user_id
--
[comments]
id parent_id parent_class oid user_id text message_id  post_date
--
[likes] - голосование
id    user_id    resource_type    resource_id message_id
-- 
[message_references]
id    message_id  reference_id type


пока что остановился на следующем алгоритме:

1. на основе таблиц messages и comments нужно получить n сообщений отсортированных по дате последних комментов в сообщении
примерно так
Код

SELECT
  messages.*, MAX(comments.post_date) AS last_update
FROM
  messages
JOIN
  comments ON comments.message_id = messages.id
WHERE
  messages.user_id = 1234
GROUP BY 
  messages.id
ORDER BY
  last_update DESC
LIMIT n
  

2. затем делаем из полученного результата получаем данные
Код

$last_updated; // тут хранится результат работы запроса
$result = array();
$messages_ids = '';
foreach ($last_updated as $message)
{
  $messages_ids .= $message->id.',';  // это сторока, на основе которой получим комменты к каждому сообщению
  $result[$message->id]['message'] = array(
    // тут заполняем массив
    'id' => $message->id,
    'text' => $message->text,
    // ....
  );
  $result[$message->id]['comments'] = array(); // тут будут комменты к сообщению
  $result[$message->id]['likes'] = array();  // тут будут likes
}
$messages_ids = substr($messages_ids, 0, -1); // удалим последнюю запятую


3. теперь надо получить комменты к сообщению.
Код

SELECT * FROM comments WHERE message_id IN ($messages_ids) ORDER BY post_date DESC


достаем для каждого сообщения по три последних коммента
Код

$comments; // хранит результат запроса
$valid = FALSE;
foreach ($comments as $comment)
{
  $valid = (count($result[$comment->message_id]['comments']) < 3) ? TRUE : FALSE; // ограничитель только, чтобы получать только 3 последних коммента
  if ($valid)
  {
    $result[$comment->message_id]['comments'][] = array(
      'text' => $comment->text,
      // забиваем инфу в массив
    );
  }
}


4. аналогино как с комментами, достаем инфу по лайкам, только не нужно ограничивать выборку

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

Добавлено @ 13:07
код писал прям сюда, может где-то напортачил немного

Это сообщение отредактировал(а) patap - 22.7.2011, 14:07


--------------------
На боку кобура болталась, сзади шашка отцовская звякала. 
Впереди меня все хохотало, а позади все плакало (с)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.