对每个用户的消息进行分组

时间:2014-12-31 12:58:54

标签: mysql sql select join inner-join

我想知道是否有人可以帮助我。我正在建立一个私人消息中心,它将使用户能够通过前端将PM发送给对方。收件箱工作正常,但是我想添加一个页面,您可以在其中单击用户名,然后您可以看到与此用户和当前登录用户之间发送和接收的所有消息。

例如:

用户1
    消息A
    消息B
    消息C
    消息D
    
    用户2
    消息A
    消息B
    消息C
    
    用户3
    消息A
    消息B
    消息C
    消息D
    消息E

在我的数据库中,我有一个包含所有用户的表:

id | user_login | user_pass | user_nicename | user_email | user_url | user_registered | user_activation_key

我有一张包含消息信息的表格:

id | parent_id | from_user | to_user | send_date | last_date | message_title | message_contents | status | to_del | from_del

表1中的用户标识对应于parent_id(回复形式的嵌套消息)和表2中的from_user和to_user。

使用下一个查询(我在Stackoverflow上找到基础之后使用),我能够回显from_user列的结果,但是我希望回显从用户发送的所有消息:

global $wpdb;
$result = $wpdb->get_results( "SELECT table1.id, table1.user_nicename, table2.id,
table2.from_user, table2.message_title FROM table1 
INNER JOIN table2 ON table1.id=table2.from_user 
GROUP BY user_nicename"  ); 

foreach($result as $row)
{
echo $row->user_nicename." <br>  ".$row->message_title."<br>";
}
?>

任何人都可以对此进行阐述并指出我正确的方向吗?我想我需要使用像INNER JOIN这样的东西来将to_user添加到查询中,但是我有点迷失了。

如果您需要更多信息,请告诉我。第一次在这里寻求帮助,所以我不知道我是否提供了足够的信息:)

非常感谢您的关注和帮助!

2 个答案:

答案 0 :(得分:3)

您可以使用group_concat函数执行此操作。

Select table1.id, table1.user_nicename, 
       group_concat(table2.message_title SEPARATOR "|") as Message
FROM table1 
LEFT JOIN table2 
ON table1.id=table2.parent_id 
GROUP BY table2.parent_id

您将通过|来汇总不同的消息 使用PHP数组explode来分隔消息。

答案 1 :(得分:1)

试试这个:

SELECT t1.id, t1.user_nicename, t2.id, t2.from_user, t2.message_title 
FROM table1 t1
INNER JOIN table2 t2 ON t1.id IN (t2.from_user, t2.to_user)
ORDER BY t1.id;

如果您想要特定用户的消息,请使用以下查询:

SELECT t1.id, t1.user_nicename, t2.id, t2.from_user, t2.message_title 
FROM table1 t1
INNER JOIN table2 t2 ON t1.id IN (t2.from_user, t2.to_user)
WHERE t1.id = 1;