我一直在尝试为我的消息传递线程(即发件人/收件人)创建一个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电子邮件收件箱时,我想通过最新显示每个唯一的(msg_id)(cur_date,cur_time),以便最新的msg / msg回复位于收件箱列表的顶部。
所以,让我们专注于Freds邮箱,因为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;
任何想法都会受到高度赞赏,我希望我能很好地解释这一点。
答案 0 :(得分: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_id
更改为thread_id
,因为它更好地涵盖了意义。
如果您想要最新的记录,请使用:
SELECT *,MAX(CONCAT(cur_date,' ',cur_time)) FROM inbox_table WHERE
recipient_email='fred@yahoo.com'
GROUP BY msg_id
答案 1 :(得分:0)
检查this fiddle,基本上,你没有引用你的字符串,WHERE
中的括号是不必要的。