我如何在codeigniter sql中实现以下条件?

时间:2015-09-25 06:50:17

标签: mysql codeigniter

我有一个名为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的最近消息等。

谢谢你的时间。

2 个答案:

答案 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,我们可以进一步查询以获取消息

如果您有更好的解决方案,请与我们分享。