Php 如何连接两个主要不同的mysql表,并同时按两列排序?

Php 如何连接两个主要不同的mysql表,并同时按两列排序?,php,mysql,date,Php,Mysql,Date,我为这个措词不当的标题道歉;想不出更好的了 我有一个发送和接收消息的应用程序。我有两个表,一个用于发送,一个用于接收: 已发送: id status sent_date user_id sent_message sent_from sent_to another_field1 another_field2 comments id received_date user_id received_message received_from received_to another_field3 ano

我为这个措词不当的标题道歉;想不出更好的了

我有一个发送和接收消息的应用程序。我有两个表,一个用于发送,一个用于接收:

已发送:

id
status
sent_date
user_id
sent_message
sent_from
sent_to
another_field1
another_field2
comments
id
received_date
user_id
received_message
received_from
received_to
another_field3
another_field4
comments
{sent_date} From me: {sent_message}
{received_date} From {received_from}: {received_message}
{received_date} From {received_from}: {received_message}
{sent_date} From me: {sent_message}
收到:

id
status
sent_date
user_id
sent_message
sent_from
sent_to
another_field1
another_field2
comments
id
received_date
user_id
received_message
received_from
received_to
another_field3
another_field4
comments
{sent_date} From me: {sent_message}
{received_date} From {received_from}: {received_message}
{received_date} From {received_from}: {received_message}
{sent_date} From me: {sent_message}
我试图显示基于这两个表的对话线程。我需要通过用户_id将两者连接起来,其中received.received_from=sent.sent_to AND received.received_to=sent.sent_from AND sent.status=1[表示它已发送],然后按两个日期列对它们进行排序——这样消息将按对话顺序显示

我看到了其他类似的问题,这些问题都是通过工会来解决的,但由于专栏不同,我不确定这是否适用于我的情况。我的显示是用PHP完成的,如下所示:

Row 1: Array(Date, Sent_Message, Sent_From)
Row 2: Array(Date, Received_Message, Received_From)
Row 3: Array(Date, Received_Message, Received_From)
Row 4: Array(Date, Sent_Message, Sent_From)
与{sent_to}的对话,按日期排序:

id
status
sent_date
user_id
sent_message
sent_from
sent_to
another_field1
another_field2
comments
id
received_date
user_id
received_message
received_from
received_to
another_field3
another_field4
comments
{sent_date} From me: {sent_message}
{received_date} From {received_from}: {received_message}
{received_date} From {received_from}: {received_message}
{sent_date} From me: {sent_message}
此外,我意识到我可能没有有效地构建数据库。我愿意听取关于如何更好地优化结构及其工作方式的建议。多谢各位

编辑:我刚试着按照阿兰·柯林斯的建议做,但我在弄清楚如何将发送字段和接收字段分开时遇到了麻烦。我真的想把这两个表放在一起,但不是把实际的字段组合起来。到目前为止,我的观点是完全错误的:

SELECT *,
     case when sent.sent_date is not null then sent.sent_date 
     else received.received_date end AS date 
FROM sent JOIN received ON (received.user_id = sent.user_id)
WHERE sent.user_id = ".$_SESSION['id']." ORDER BY date ASC
这是将接收和发送的消息合并为一行。我仍然需要他们分开。有什么建议吗?在一个表中发送和接收消息可能会更容易一些吗

编辑2:为了澄清,我希望两个表中的列分开。也就是说,返回的行应该只有sent列或received列,但是这些行应该按照日期的顺序返回,如上所述。所以我会得到这样的行:

Row 1: Array(Date, Sent_Message, Sent_From)
Row 2: Array(Date, Received_Message, Received_From)
Row 3: Array(Date, Received_Message, Received_From)
Row 4: Array(Date, Sent_Message, Sent_From)

因此,这两个表唯一的共同点是1)进行对话的用户id和2)日期。日期必须以某种方式组合,因为它们当前是“发送日期”和“接收日期”。

如果您围绕“线程id”构建表,而不是尝试通过“发送日期=记录日期”进行匹配,那么您可能会更容易进行组合。创建新消息(即不响应)时,使用新消息id创建一个新线程。然后对此的任何响应都将引用原始线程id,您可以按消息id对响应进行排序,以获得线程的顺序。

创建一列,其中包含基础表中的日期,并按以下顺序排序:

select case
  when sent.sent_date is not null then sent.sent_date
  else received.received_date
end as message_date
...
order by message_date;

我找到了我要做的事情的正确查询:

(SELECT sent_date AS date, sent_message, sent_from 
FROM sent WHERE user_id = ".$_SESSION['id'].") 
UNION ALL (SELECT received_date AS date, received_message, received_from 
FROM received WHERE user_id = ".$_SESSION['id'].") 
ORDER BY date ASC

在查询中将发送列与接收列分离时遇到问题。它目前将它们合并成一行,这不是我想要的。我用到目前为止的代码编辑了主要帖子。你介意告诉我吗?我读了你的要求,你想得到4列回来,其中包含发送和接收消息的混合(如上面你的“Conversions with”标题下所示)。如果这不是你想要的输出,你能给我们看看吗?我为你的困惑道歉。我第二次编辑了这篇主要文章。换句话说,我尝试将一个表添加到另一个表中,然后获取我想要的用户id,并按其日期排序。我不想把行组合在一起。抱歉,很难用文字解释=\谢谢您的帮助!在做了一些搜索之后,我找到了答案。看看我的另一个答案。对不起,用词不对!这可能会使WHERE条款变得更容易,但我问题的主要问题仍然没有解决。我很难将接收列与发送列分开。你知道如何使用mysql查询实现这一点吗?我用到目前为止的代码编辑了主要帖子。因为你提到了加入,我想你已经加入了。哦,好吧。很高兴你解决了。