2014-02-17 115 views
1

我正在开发一个使用数据库中以下结构的消息传递系统。消息系统 - MySql/PHP/Kohana

I took the diagram here on the site

的问题是如何通过用户选择PHP分组的所有消息。

EX:

从用户A - 所有消息至用户X

- 所有从用户B到用户X

从用户C到用户X

- 所有消息的消息(用户X =用户登录)

+0

我认为你的意思是“排序”,而不是由用户“分组”,对吧? – Asenar

+0

“users_has_messages”表中的user_id是什么意思?你如何知道每条消息的“from”和“to”?你有更多的桌子或更多的领域? –

+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来到这里的。谢谢! 难以仅显示每个对话的最后一条消息,按用户分组。就像在左侧的脸书聊天中,我与该人的最后一次对话出现。 –

+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__ 

只是你有兴趣从得到消息的用户的ID替换__THE ID OF THE USER__

此查询的工作方式是通过“关于”特定条件“加盟”的表一起。首先,我们将users表加入users_has_messages表,users.id = users_has_messages.users_id然后我们对messages表执行类似的“加入”。

最后使用WHERE语句来定义的条件。在这种情况下,我们只需要具有特定ID的用户。

在看了您最后一次编辑之后,您似乎也希望获得来自的所有消息以及特定用户。不幸的是,你的模式没有谁发送消息的信息。如果你需要,你将不得不将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__