Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用户之间的消息:显示对话_Php_Mysql_Sql_Group By - Fatal编程技术网

Php 用户之间的消息:显示对话

Php 用户之间的消息:显示对话,php,mysql,sql,group-by,Php,Mysql,Sql,Group By,我正在编写一个用于用户通信的消息系统。在收件箱中,我不想向用户显示他/她收到的消息。我只想展示对话。例如,如果一个用户发送或接收多条消息,那么收件箱中应该只有与该用户的对话(包括最新的书面或接收的消息),当用户单击对话时,他/她可以看到所有过去的消息 “消息”的表结构(简化)如下所示: message_id user_id_sender user_id_recipient message 现在的问题是,这些消息保存在一个数据库中,其中每一行都是一条消息,因此我必须以某种方式对这些消息进行分组

我正在编写一个用于用户通信的消息系统。在收件箱中,我不想向用户显示他/她收到的消息。我只想展示对话。例如,如果一个用户发送或接收多条消息,那么收件箱中应该只有与该用户的对话(包括最新的书面或接收的消息),当用户单击对话时,他/她可以看到所有过去的消息

“消息”的表结构(简化)如下所示:

message_id
user_id_sender
user_id_recipient
message
现在的问题是,这些消息保存在一个数据库中,其中每一行都是一条消息,因此我必须以某种方式对这些消息进行分组

我提出的select语句如下所示:

SELECT * FROM messages
WHERE user_id_sender = 1 OR user_id_recipient = 1
GROUP BY user_id_sender
但现在我显然收到了两条消息,一条是用户“1”写的,另一条是他收到的


有人知道如何解决这个问题吗?

只要消息(
message\u id
)是唯一的,您只会收到一条消息。当然,如果通信时间更长,您将收到多条消息

注意:此处不需要
groupby
,因为这仅用于聚合列,例如:

SELECT user_id_sender, sum(*) FROM messages
GROUP BY user_id_sender;
您可以从中获取每个用户发送的消息总数

因此,如果您想查看两个用户之间的通信:

SELECT * FROM messages
WHERE user_id_sender = 1 OR user_id_recipient = 1;
如果您还存储了时间戳,例如,
message\u time
,或者限制显示的消息数量,则可以进一步限制此操作:

select * from ... limit 10;

只要消息(
message\u id
)是唯一的,您只会收到一条消息。当然,如果通信时间更长,您将收到多条消息

注意:此处不需要
groupby
,因为这仅用于聚合列,例如:

SELECT user_id_sender, sum(*) FROM messages
GROUP BY user_id_sender;
您可以从中获取每个用户发送的消息总数

因此,如果您想查看两个用户之间的通信:

SELECT * FROM messages
WHERE user_id_sender = 1 OR user_id_recipient = 1;
如果您还存储了时间戳,例如,
message\u time
,或者限制显示的消息数量,则可以进一步限制此操作:

select * from ... limit 10;

假设消息_id是递增的(即较高的id用于后面的消息)
@user\u id
只是您正在查看的收件箱的
用户id
的占位符。我使用了Andrea的技巧,简洁地获取了
其他收件人id

Select 
  mm.other_recipient_id,
  m.*
From (
  Select
    user_id_sender + user_id_recipient - @user_id as other_recipient_id,
    Max(message_id) as message_id
  From
    messages
  Where
    user_id_sender = @user_id Or
    user_id_recipient = @user_id
  Group By
    user_id_sender + user_id_recipient - @user_id
  ) mm
    Inner Join
  messages m
    On
  mm.message_id = m.message_id

例如fiddle

假设消息的id是递增的(即更高的id用于后面的消息)
@user\u id
只是您正在查看的收件箱的
用户id
的占位符。我使用了Andrea的技巧,简洁地获取了
其他收件人id

Select 
  mm.other_recipient_id,
  m.*
From (
  Select
    user_id_sender + user_id_recipient - @user_id as other_recipient_id,
    Max(message_id) as message_id
  From
    messages
  Where
    user_id_sender = @user_id Or
    user_id_recipient = @user_id
  Group By
    user_id_sender + user_id_recipient - @user_id
  ) mm
    Inner Join
  messages m
    On
  mm.message_id = m.message_id

示例fiddle

假设我们希望看到具有特定uID的用户的对话,此查询可能很有用:

SELECT (user_id_sender + user_id_recipient) - _ID_ AS correspondent, COUNT(*) AS total
FROM messages
WHERE user_id_sender = _ID_ OR user_id_recipient = _ID_
GROUP BY (user_id_sender + user_id_recipient)
结果查询返回对话的另一个用户的ID(“通讯者”)和两个用户之间的消息数(“总数”)


关于

假设我们希望看到用户与某些uid_uu的对话,此查询可能很有用:

SELECT (user_id_sender + user_id_recipient) - _ID_ AS correspondent, COUNT(*) AS total
FROM messages
WHERE user_id_sender = _ID_ OR user_id_recipient = _ID_
GROUP BY (user_id_sender + user_id_recipient)
结果查询返回对话的另一个用户的ID(“通讯者”)和两个用户之间的消息数(“总数”)


我几个月前就解决了这个问题。我想您还有一个
date
字段。此查询提供结构良好的结果,其中包含最后一条消息的日期和最后一条消息的日期

$qry = 'SELECT 
CONCAT(GREATEST(user_id_sender,user_id_recipient)," ",LEAST(user_id_sender,user_id_recipient)) AS thread, 
MAX(CONCAT(date,"|",message)) as date_message, 
MAX(date) AS last_message, 
messages.* 
     FROM messages
     WHERE user_id_sender= ? || user_id_recipient=? GROUP BY thread ORDER BY last_message DESC';

$rows = $db->fetchAll($qry, Array($current_user_id,$current_user_id));

我几个月前就解决了这个问题。我想您还有一个
date
字段。此查询提供结构良好的结果,其中包含最后一条消息的日期和最后一条消息的日期

$qry = 'SELECT 
CONCAT(GREATEST(user_id_sender,user_id_recipient)," ",LEAST(user_id_sender,user_id_recipient)) AS thread, 
MAX(CONCAT(date,"|",message)) as date_message, 
MAX(date) AS last_message, 
messages.* 
     FROM messages
     WHERE user_id_sender= ? || user_id_recipient=? GROUP BY thread ORDER BY last_message DESC';

$rows = $db->fetchAll($qry, Array($current_user_id,$current_user_id));

数据库中的每封邮件都有两个条目?数据库中的每封邮件都有两个条目?我喜欢你获取通讯员id的方法,我在回答中用这个替换了一个更麻烦的案例陈述。我喜欢你获取通讯员id的方法,在我的回答中,我用这个替换了一个更麻烦的案例陈述。非常感谢你的回答。这很好,但是我得到了日期消息字段的“[BLOB-25字节]”。如何从日期\消息字段中提取消息?这是因为不同类型的组concat将在二进制字段中转换。但是,当您使用php获得结果并使
爆炸(“|“,$row['last_message'))
非常感谢您的回答时,这应该不是问题。这很好,但是我得到了日期消息字段的“[BLOB-25字节]”。如何从日期\消息字段中提取消息?这是因为不同类型的组concat将在二进制字段中转换。但是,当您使用php获得结果并使
分解(“|“,$row['last_message'])时,应该不会有问题。