如何连接两个大多不同的mysql表,并一次按两列排序?

时间:2012-10-11 16:11:37

标签: 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
another_field4
comments

我正在尝试显示基于这两个表的会话线程。我需要通过user_id加入两个,WHERE received.received_from = sent.sent_to AND received.received_to = sent.sent_from AND sent.status = 1 [表示已发送],然后按两个日期列对它们进行排序 - 所以消息以对话顺序显示。

我看到其他类似的问题使用联盟来做到这一点,但我不确定在我的情况下由于不同的列会起作用。用PHP完成的我的显示将是这样的:

与{sent_to}对话,按日期排序:

{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}

另外,我意识到我可能无法有效地构建数据库。我对如何更好地优化结构及其工作原理持开放态度。谢谢。

编辑:我刚刚尝试过做Alain Collins的建议,但我无法弄清楚如何将已发送的字段与接收的字段分开。我真的想把两张桌子放在一起,但不是把实际的字段组合在一起。这是我到目前为止所做的,这是完全错误的:

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:为了澄清,我希望两个表中的列分开。这意味着,返回的ROWS应该只发送列或接收列,但应按日期顺序返回行,如上所述。所以我会得到这样的行:

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)具有对话的user_id和2)日期。必须以某种方式组合日期,因为它们目前是“sent_date”和“received_date”。

3 个答案:

答案 0 :(得分:1)

如果你围绕'thread_id'构建表而不是试图通过'sent_to = recd_from'匹配,你可能会更容易。创建新消息(即未响应)时,创建具有新消息ID的新线程。然后对此的任何响应都将引用原始的thread_id,您可以按消息ID对响应进行排序以获取线程的顺序。

答案 1 :(得分:0)

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

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;

答案 2 :(得分:0)

我想出了正在尝试做的正确查询:

(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