如何编写这个特定的MySQL查询?

时间:2013-03-10 19:01:35

标签: mysql

我一直在尝试为我的消息传递线程(即发件人/收件人)创建一个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;

任何想法都会受到高度赞赏,我希望我能很好地解释这一点。

2 个答案:

答案 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中的括号是不必要的。