我有一个名为message_system的表。
表的结构如下:
message_system => message_id(primary key)->sender_id->receiver_id->
message->time(current time stamp)
让我们考虑一个$user_id = 1
,我想从表中选择一行
select * from message_system where sender_id = $user_id or receiver_id = $user_id
从我想要的结果中我只想选择最近根据时间戳存储的单个结果。
实际上我想从两个用户之间的消息线程中选择最近的消息..
编辑1:
我想从表格中获取最新消息 唯一对(user1_id和user2_id)。它是(user1_id, user2_id)或(user2_id,user1_id)通常是登录用户的用户ID 将是id和另一个是已经用户的id 发送给当前登录用户。
编辑2:
示例:
让我们考虑用户1已登录,并且已向user2发送消息。然后发送给user3和user4。 并且所有消息都存储在表中,现在我想查询,以便它只检索user1墙中user2,user3,user4的最近消息。不是他们所有的历史
编辑3:
查询应返回登录用户的最近消息,其中包含user1以及登录用户user2和user3的最近消息等。
谢谢你的时间。答案 0 :(得分:1)
select * from message_system where sender_id = $user_id or receiver_id = $user_id
将在CodeIgniter中翻译:
$this->db->where('sender_id', $user_id);
$this->db->or_where('receiver_id', $user_id);
$query = $this->db->get('message_system');
$row = $query->row();
如果您想要最新的输入,可以按time
订购,如果您知道只需要一行,则限制为1:
$this->db->where('sender_id', $user_id);
$this->db->or_where('receiver_id', $user_id);
$this->db->order_by('time', 'desc');//order by time
$this->db->limit('1');//limit the query to only one row
$query = $this->db->get('message_system');
$row = $query->row();// get only first
<强>更新强> 如果要查找与一个给定用户相对应的一个条目,则上述解决方案有效。 如果你想找到一对特定用户的最后一个条目,那么如果不知道谁将成为发送者并且谁将是接收者,事情将会是这样的:
$this->db->where_in('sender_id', array($user_id1, $user_id2));
$this->db->where_in('receiver_id', array($user_id1, $user_id2));
$this->db->order_by('time', 'desc');//order by time
$this->db->limit('1');//limit the query to only one row
$query = $this->db->get('message_system');
$row = $query->row();// get only first
如果您确切知道谁是谁,那就像这样:
$this->db->where('sender_id', $user_id1);
$this->db->where('receiver_id', $user_id2);
$this->db->order_by('time', 'desc');//order by time
$this->db->limit('1');//limit the query to only one row
$query = $this->db->get('message_system');
$row = $query->row();// get only first
答案 1 :(得分:0)
通过对表的一点点修改,我想出了一个主意。
早些时候我的表结构是:
message_system => message_id(primary key)->sender_id->receiver_id->
message->time(current time stamp)
修改后:
message_system => message_id(primary key)->sender_id->receiver_id->
message->time(current time stamp)->unique_pair_key
unique_pair_key 用于识别两个用户之间唯一的消息,而值将是这样的($sender_id^2 + $receiver_id^2)
这对于给定的对是唯一的。
两个特定用户之间的所有消息都将通过此unique_pair_key识别。
所以把logged_in用户作为引用,关于他只应该显示不同用户的最近消息(如果有的话)(类似于堆栈溢出最近的收件箱消息),并且点击该特定消息时应该指向他们的消息线程。
模型/ model.php
public function get_notification($user_id)
{
$this->db->where("receiver_id",$user_id);
$this->db->where("sender_id",$user_id);
//because recent message would either be sent or received by logged in user
$this->db->select_max('message_id');
// latest message would have greatest value of id
$this->db->group_by('unique_pair_key');
$query = $this->db->get('message_system ');
//returns latest message_id with unique pair in which on of them is $userid.
}
上面的查询只生成消息ID,我们可以进一步查询以获取消息
如果您有更好的解决方案,请与我们分享。