0

我一直在尝试为我的消息传递线程(即发件人/收件人)创建一个 MySQL 查询。

我有一个带有字段的表(msg_id = 唯一的 6 位 id,如 123456)。这个 (msg_id) 字段可能有很多行(对于每个 msg 回复),其中每一行都会像线程一样具有相同的 (msg_id)。因此,假设 bob 开始向 fred 发送消息,因此表中的线程将类似于(仅用于说明这一点的粗略示例):-

+---------+---------------------------+--------------------------+------------------------+------------+----------+
| msg_id  | sender_email              | recipient_email          | sender_msg             | cur_date   | cur_time |
+---------+---------------------------+--------------------------+------------------------+------------+----------+
| 3189855 | bob@hotmail.com           | fred@yahoo.com           | hi fred, how are you?  | 2013-03-10 | 17:12:18 |
| 3189855 | fred@yahoo.com            | bob@hotmail.com          | hi bob, I am great     | 2013-03-10 | 17:15:20 |
| 3189855 | bob@hotmail.com           | fred@yahoo.com           | hi fred, good to hear  | 2013-03-10 | 17:20:10
| 6749672 | jenny@barclay.cc          | fred@yahoo.com           | some other message     | 2013-03-10 | 14:52:49 |
+---------+---------------------------+--------------------------+------------------------+------------+----------+

当显示 bobs 或 freds 电子邮件收件箱时,我想按最新(cur_date,cur_time)显示每个唯一的(msg_id),以便最新的 msg/msg 回复位于收件箱列表的顶部。

因此,让我们关注 Fred 邮箱,因为 Fred 拥有最多的邮件。我希望我的查询在输出收件箱电子邮件时显示以下结果:

+---------+---------------------------+--------------------------+------------------------+------------+----------+
| msg_id  | sender_email              | recipient_email          | sender_msg             | cur_date   | cur_time |
+---------+---------------------------+--------------------------+------------------------+------------+----------+
| 3189855 | bob@hotmail.com           | fred@yahoo.com           | hi fred, good to hear  | 2013-03-10 | 17:20:10 |
| 6749672 | jenny@barclay.cc          | fred@yahoo.com           | some other message     | 2013-03-10 | 14:52:49 |
+---------+---------------------------+--------------------------+------------------------+------------+----------+

因此,查询获取每个唯一的 (msg_id) 并且对于每个唯一的 (msg_id),它获取最后一行(即,作为发送的线程中的最后一个 msg,它适用于发送的最新 msg)。如果这是有道理的。因此,我的问题是如何生成此 SQL 查询以给出上述结果。我的想法如下,但不起作用:-

SELECT * FROM inbox_table WHERE (recipient_email='fred@yahoo.com' AND ORDER BY cur_date DESC, cur_time DESC) GROUP BY msg_id ORDER BY cur_date DESC, cur_time DESC;

任何想法将不胜感激,我希望我能很好地解释这一点。

4

2 回答 2

1

可能,您只需要在字符串周围添加引号,并且ORDER BY子句需要放在最后,并且只有一次:

SELECT * FROM inbox_table WHERE 
   recipient_email='fred@yahoo.com' 
   GROUP BY msg_id ORDER BY cur_date DESC, cur_time DESC;

例如,将聚合函数添加到SELECT子句中可能很有意义COUNT,因此您还可以知道线程中有多少条消息:

SELECT *,COUNT(msg_id) FROM inbox_table WHERE 
   recipient_email='fred@yahoo.com' 
   GROUP BY msg_id ORDER BY cur_date DESC, cur_time DESC;

最后,我建议将名称更改msg_idthread_id,因为它可以更好地涵盖含义。

如果您想要按时间获取最新记录,请使用以下命令:

 SELECT *,MAX(CONCAT(cur_date,' ',cur_time)) FROM inbox_table WHERE 
   recipient_email='fred@yahoo.com' 
   GROUP BY msg_id
于 2013-03-10T19:04:28.783 回答
0

检查这个小提琴,基本上,你没有引用你的字符串,括号WHERE是不必要的。

于 2013-03-10T19:19:43.607 回答