0

对于措辞不当的标题,我深表歉意;想不出更好的了。

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

发送:

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”。

4

3 回答 3

1

如果您围绕“thread_id”构建表格而不是尝试通过“sent_to=recd_from”进行匹配,那么您可能会更轻松。当创建新消息(即不响应)时,创建一个具有新消息 ID 的新线程。然后对此的任何响应都将引用原始 thread_id,您可以按消息 id 对响应进行排序以获取线程的顺序。

于 2012-10-11T16:18:21.463 回答
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;
于 2012-10-11T16:27:30.277 回答
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
于 2012-10-12T00:24:40.517 回答