我已经建立了一个消息传递/聊天系统,我需要扩展它的功能。用户发布消息时,他们可以选择将消息定向到一个或多个用户。这是我制作的两个表的结构。
chat_message CREATE TABLE `chat_message` (
`chat_message_id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) DEFAULT NULL,
`chat_message` text NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT current_timestamp() COMMENT 'time message was sent',
PRIMARY KEY (`chat_message_id`)
) ENGINE=InnoDB AUTO_INCREMENT=79 DEFAULT CHARSET=latin1
chat_to_users CREATE TABLE `chat_to_users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`message_id` int(11) NOT NULL,
`to_user_id` int(11) NOT NULL DEFAULT 0,
`from_user_id` int(11) NOT NULL,
`read_timestamp` timestamp NULL DEFAULT NULL COMMENT 'time user read message',
`status` int(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=56 DEFAULT CHARSET=latin1
我正在尝试输出消息:https://imgur.com/qaAZhey
这实际上是3条消息,但总共显示5条消息,因为3条消息中有2条针对多个用户。
我希望它显示更多类似“发件人:from_user-收件人:to_user1,to_user2等”的信息。如果邮件定向到一个以上的人,则只需添加其他用户名即可。
这是我的PHP:
<?php
function fetch_order_messaging_history( $order_id, $pdo ) {
//construct SQL query
$query = "
SELECT
msg.chat_message_id,
msg.order_id,
msg.chat_message,
msg.timestamp AS sent_timestamp,
usr.id AS chat_to_users_id,
usr.message_id,
usr.to_user_id,
usr.from_user_id,
usr.read_timestamp AS read_timestamp,
usr.status
FROM chat_message AS msg
LEFT JOIN chat_to_users AS usr
ON msg.chat_message_id = usr.message_id
WHERE msg.order_id = $order_id
ORDER BY msg.timestamp DESC
";
//prep, execute, & fetch SQL results
$statement = $pdo->prepare ( $query );
$statement->execute();
$result = $statement->fetchAll();
//construct HTML for browser output
$output = '<ul class="list-unstyled">';
foreach ( $result as $row ) {
$user_name = '';
$track_msg_id = $row['chat_message_id'];
if ( $row[ 'from_user_id' ] == $_SESSION['user_id' ] ) {
$from_user_name = '<b class="text-success">You</b>';
} else {
$from_user_name = '<b class="text-success">' . get_user_name( $row[ 'from_user_id' ], $pdo ) . '</b>';
}
$output .= '
<li style="border-bottom:1px dotted #ccc">
<p>' . 'From: ' . $from_user_name . ' To: ' . get_user_name( $row[ 'to_user_id' ], $pdo ) . ' - '. $row[ 'chat_message' ] . '
<div align="right">
- <small><em>' . $row[ 'sent_timestamp' ] . '</em></small>
</div>
</p>
</li>
';
}
$output .= '</ul>';
//output HTML to browser
return $output;
}
?>
答案 0 :(得分:1)
您可以使用GROUP_CONCAT()
聚合公式和GROUP BY
来完成此操作:
SELECT
msg.chat_message_id,
msg.order_id,
msg.chat_message,
msg.timestamp AS sent_timestamp,
usr.id AS chat_to_users_id,
usr.message_id,
GROUP_CONCAT(usr.to_user_id SEPARATOR ',') AS to_user_ids,
usr.from_user_id,
usr.read_timestamp AS read_timestamp,
usr.status
FROM chat_message AS msg
LEFT JOIN chat_to_users AS usr
ON msg.chat_message_id = usr.message_id
WHERE msg.order_id = $order_id
GROUP BY
msg.chat_message_id,
msg.order_id,
msg.chat_message,
msg.timestamp,
usr.id,
usr.message_id,
usr.from_user_id,
usr.read_timestamp,
usr.status
ORDER BY msg.timestamp DESC
如果每个记录的read_timestamp
或status
也不同,则可能必须弄清楚如何汇总(分组,求和,选择“最大”等)。