2014-02-17 5 views
1

Я разрабатываю систему обмена сообщениями, используя следующую структуру в базе данных.Система обмена сообщениями - MySql/PHP/Kohana

I took the diagram here on the site

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

EX:

-Вс сообщений от пользователя А к пользователю X

-Вс сообщения от пользователя к пользователю B X

-Вс сообщений от пользователя к пользователю C Й

(пользователь X = пользователь зарегистрирован)

+0

Я думаю, что вы имеете в виду «отсортированный», а не «сгруппированный» пользователем, не так ли? – Asenar

+0

Что означает 'user_id' в таблице' users_has_messages'? Откуда вы знаете «от» и «до» для каждого сообщения? У вас больше таблиц или больше полей? –

+0

сгруппирован. Записанный пользователь видит все разговоры, которые у него были. равно в сообщениях facebook –

ответ

1

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

$user_id = '1'; // whatever how you get the current user 
$messages = DB::select('*')->from('messages') 
    ->join('users_has_messages', 'LEFT')->on('messages_id', '=', 'id') 
    ->where('users_id', '=', $user_id) 
    ->order_by('from_id ASC') 
    ->execute()->as_array(); 
foreach($messages as $msg) 
{ 
    echo $msg->id.':'.$msg->subject.'<br/>'; 
} 
+0

Хорошо, перечислены все мои сообщения, я приехал сюда с помощью Kohana ORM. Спасибо! Трудно отображать только последнее сообщение каждого разговора, группируя его по пользователю. как в чате facebook на левой стороне появляются мои последние разговоры с этим человеком. –

+0

, чтобы отображать только последнее сообщение, вы можете комбинировать 'order_by()' с 'limit (1)'.Это работает для объекта Database_Query_Builder, а также, вероятно, для ORM – Asenar

1

Вы можете легко получить все сообщения с помощью MySQL-запроса:

SELECT messages.* FROM users 
JOIN users_has_messages ON users.id = users_has_messages.users_id 
JOIN messages ON users_has_messages.messages_id = messages.id 
WHERE users.id = __THE ID OF THE USER__ 

Просто замените __THE ID OF THE USER__ на идентификатор пользователя, которого вы заинтересованы в получении сообщений.

Способ, которым работает этот запрос, заключается в «объединении» таблиц вместе «на» определенных условиях. Сначала мы присоединяем таблицу users к таблице users_has_messages, когда users.id = users_has_messages.users_id, тогда мы делаем аналогичное «соединение» с таблицей messages.

Наконец, вы используете инструкцию WHERE для определения условий. В этом случае нам нужны только пользователи с определенным идентификатором.

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

SELECT messages.* FROM users 
JOIN users_has_messages ON users.id = users_has_messages.users_id 
JOIN messages ON users_has_messages.messages_id = messages.id 
WHERE users.id = __THE ID OF THE RECIEVER__ 
AND messages.send_user_id = __THE ID OF THE SENDER__ 
Смежные вопросы