Выборка из базы личных сообщений.

Jigan2

Новичок
Здравствуйте уважаемые. Не могу правильно сделать выборку из базы. Есть таблица такого вида:



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

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

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

сделать.
Данный код такого вида:
Модель запросов к базе:
Код:
class messageModel extends Model{
    public function __construct(){
        parent::__construct('message');
    }
    public function listMessage($condition,$page='') {
        $condition_str = $this->getCondition($condition);
        $param    = array();
        $param['table']        = 'message';
        $param['where']        = $condition_str;
        $param['order']        = 'message.message_id DESC';
        $message_list        = Db::select($param,$page);
        return $message_list;
    }
}
Обращение к модели:



Код:
public function messageOp() {
        Language::read('member_home_message');
        $model_message    = Model('message');
        $page    = new Page();
        $page->setEachNum(10);
        $page->setStyle('admin');
        $message_list_array    = $model_message->listMessage(array('message_type'=>'0','to_member_id_common'=>$_SESSION

['member_id'],'no_message_state'=>'2'),$page);
        Tpl::output('message_array',$message_list_array);
        Tpl::showpage('message_box');
    }

При таком запросе у меня выводится следующее:


Это переписка одной темы, должно быть одно последнее сообщение. Подскажите как сделать уже голову сломал. Наверное как то по

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

С.

Продвинутый новичок
Надо отсортировать по дате в обратном порядке и взять одну первую найденную строку.
 

Vano

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

Jigan2

Новичок
Jigan2, Скорее всего тебе нужно 2 таблицы - Сообщения и ответы на сообщения. Удобством будет простота кода, человекопонятные таблицы и если поставить внешний ключ, то удаление будет одним запросом
Для чего две таблицы. Все скрипты которые я уже смотрел используют одну таблицу и там все нормально работает. Только я у себя понять не могу как сделать уже 3 дня мучаюсь. Надо просто как то по дате сортировать. Только как?!
 

Vano

Новичок
Jigan2, проще работать будет, проще код выглядеть будет. Понятнее для человека, тяжелее запутаться. Ану скажи в точности задачу, я правильно понял? -
Чел пишет сообщение(id1) челу2, оно появляеться у чела в исходящих, и у чела2 во входящих. Чел2 отвечает на него, и у обоих при просмотре этого сообщение(id1) получаеться как бы чатик со всей перепиской этих двух челов на данное сообщение(id1). Так?
 

С.

Продвинутый новичок
А поп подробнее можно как это реализовать. Если можно на моем примере.
Я не знаю, как это сделать на твоем примере. Ты пользуешься модулем с неизвестным мне интерфейсом. Смотри документацию на этот модуль.
 

Jigan2

Новичок
Jigan2, проще работать будет, проще код выглядеть будет. Понятнее для человека, тяжелее запутаться. Ану скажи в точности задачу, я правильно понял? -
Чел пишет сообщение(id1) челу2, оно появляеться у чела в исходящих, и у чела2 во входящих. Чел2 отвечает на него, и у обоих при просмотре этого сообщение(id1) получаеться как бы чатик со всей перепиской этих двух челов на данное сообщение(id1). Так?
Да ты все правильно понял. Это уже все реализовано. Нужно только реализовать что бы во входящих выводились все последние сообщения всех переписок со всеми пользователями. Ну как во всех почтовиках например gmail. Хоть убей не понимаю как это сделать уже аж псих берет.
Колонка to_member_id это кому отправлено сообщение. message_parent_id это ветка какого сообщения.
 

Jigan2

Новичок
Я не знаю, как это сделать на твоем примере. Ты пользуешься модулем с неизвестным мне интерфейсом. Смотри документацию на этот модуль.
Это не модуль а функционал движка. Была бы документация я бы здесь не писал. Предпочитаю сначала сам попробовать все варианты а потом уже грузить кого то вопросами. Я просто новичок в этом деле и учусь на готовом движке переделывая его и улучшая.
 

Vano

Новичок
Jigan2, на той картинке у тебя выводит сообщение и ответ на него же? А тебе нужно только сообщение?
 

Jigan2

Новичок
Jigan2, на той картинке у тебя выводит сообщение и ответ на него же? А тебе нужно только сообщение?
Там выводит вообще все входящие сообщения и ответы и приветы.) Мне нужно что бы все ответы не выводились а выводились только последние сообщения из переписок, если переписок нет то выводились просто входящие сообщения.
 

Vano

Новичок
Когда я вывожу данные из базы то во входящих выводятся все сообщения переписки

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

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

сделать
Ничего не понятно зачем тебе это, какие ты условия хочеш ставить тоже не понятно. По такому вопросу могу ответить
$param = array();
$param['table'] = 'message';
$param['where'] = $condition_str;
$param['order'] = 'message.message_id DESC'; - тут у тебя значит что начинать поиск с самого последнего
--ДОБАВЬ тут $param['limit'] = 1; что будет означать взять только одну запись
 

Vano

Новичок
Jigan2, в общем, если тебе трудно придумать точное условие( а не розмазню типа я хочу так чтобы было сяк но не знаю как) по которому тебе нужно вынуть записи, советую на бумаге сночала запрос написать( типа такого: вынуть все сообщения пользователя $_Session['member_id'] которые имеют статус такойто, у которых to_member_id $_Session['member_id'] ... и тд) и потом перевести на язык mysql))) можешь даже сюда написать на mysql уже переведу)
 

Jigan2

Новичок
Ничего не понятно зачем тебе это, какие ты условия хочеш ставить тоже не понятно. По такому вопросу могу ответить
$param = array();
$param['table'] = 'message';
$param['where'] = $condition_str;
$param['order'] = 'message.message_id DESC'; - тут у тебя значит что начинать поиск с самого последнего
--ДОБАВЬ тут $param['limit'] = 1; что будет означать взять только одну запись
Все равно так же выводится. Это нужно для того что бы не отображать во входящих все сообщения переписки, а только последнее сообщение из ветки. Зачем выводить все сообщения?! Когда нажимаешь на это сообщение тогда уже открывается вся ветка.



Видишь на картинке. Нужно что бы выводилось 5 сообщение. Понял?
 

Jigan2

Новичок
Jigan2, О о о. Теперь понятно. Щас подумаю
Нужно наверное в одном запросе к базе брать все значения по id получателя. Потом брать дату сортировать и во втором запросе брать значения по дате. Я сейчас так пробую только не получается пока.
 

С.

Продвинутый новичок
Нужно наверное в одном запросе к базе брать все значения по id получателя. Потом брать дату сортировать и во втором запросе брать значения по дате. Я сейчас так пробую только не получается пока.
Даже если так, то второй-то запрос на кой хрен?

Я тебе уже дал правильный алгоритм, но похоже оно ушло в пустоту.
 

Jigan2

Новичок
Даже если так, то второй-то запрос на кой хрен?

Я тебе уже дал правильный алгоритм, но похоже оно ушло в пустоту.
Я просто не знаю как это сделать покажи пример пожалуйста.
Я сделал так вроде все работает:
Модель такая:
Код:
class messageModel extends Model{
    public function __construct(){
        parent::__construct('message');
    }
    public function listMessage($condition,$page='') {
        $condition_str = $this->getCondition($condition);
        $param    = array();
        $param['table']        = 'message';
        $param['where']        = $condition_str;
        $message_list        = Db::select($param,$page);
        return $message_list;
    }
    public function listMessageArray($condition, $page='', $field='*', $order = 'message_parent_id desc') {
        return $this->table('message')->field($field)->where($condition)->group(message_parent_id)->order($order)->page($page)->select();
    }
}
Обращение такое:
Код:
public function messageOp() {
        Language::read('member_home_message');
        $model_message    = Model('message');
        $page    = new Page();
        $page->setEachNum(10);
        $page->setStyle('admin');
        $message_list_array    = $model_message->listMessage(array('message_type'=>'0','to_member_id_common'=>$_SESSION['member_id'],'no_message_state'=>'2'),$page);
     
        if(!empty($message_list_array)){
        $message_parent_id = array();
        foreach($message_list_array as $key => $val){
        $message_time[$val['message_parent_id']] = $val['message_time'];
        $message_parent_id[] = $val['message_parent_id'];
        }
        $message_time[] = max($message_time);
        $message_time = array_unique($message_time);
        $message_parent_id = array_unique($message_parent_id);
     
        $condition = array();
        $condition['message_parent_id'] = array('in', $message_parent_id);
        $condition['to_member_id'] = $_SESSION['member_id'];
        $condition['message_time'] = array('in', $message_time);
     
        $message_array    = $model_message->listMessageArray($condition,$page);
        }
        Tpl::output('message_array',$message_array);
        Tpl::showpage('message_box');
    }
Два обращения к базе. Может как то лучше можно сделать подскажи.
 
Сверху