2013-02-04 34 views
3

我正在开发邮件系统并且在写下查询(MYSQL)时遇到了麻烦。 简而言之,查询应该将每个对话用户的最后一条消息的数组返回给用户。用于邮件系统的mysql查询

CREATE TABLE 'tbl_message'('id' int(10) AUTO_INCREMENT, 
    'from_user' int(10), 
    'to_user' int(10), 
    'reply_to' int(10), 
    'subject', 
    'body' text, 
    'status' tinyint(3), 
    'deleted_from_sender' tinyint(3), 
    'deleted_from_recipient' tinyint(3)', 
    'created_on' datetime, 

我写查询:

SELECT * FROM tbl_message s1 WHERE s1.created_on IN (
    SELECT MAX(s2.created_on) 
     FROM tbl_message s2 WHERE s1.from_user=".$userID." OR s2.to_user=".$userID." 
     GROUP BY s2.from_user, s2.to_user) 
     AND status = 0"; 

这工作正常,但给我的FROM_USER和to_user 2级最后的消息,而不是从两个1成最后一条消息。那是因为GROUP BY当然了,现在的问题是我怎么能在子查询中找到最大的created_on(实际上是mysql datestamp)?或者任何其他解决方案将不胜感激。 感谢任何帮助或建议。

2天后挖计算器和MySQL手册,希望从DB教授:)

UPD帮助: 一些数据,例如

+----+-------+--------+--------+---------------------+--------+---------+ 
| id | from_user | to_user | subject  | created_on   | status | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 1 | 68  | 128 | somesubject1 | 2013-07-01 21:31:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 2 | 128 | 68 | somesubject2 | 2013-07-01 21:41:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 3 | 128 | 68 | somesubject3 | 2013-07-01 21:51:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 4 | 68  | 226 | somesubject4 | 2013-07-01 22:01:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 

查询的输出

| 3 | 128 | 68 | somesubject3 | 2013-07-01 21:51:29 |  0 | 
+----+-------+--------+--------+---------------------+--------+---------+ 
| 4 | 68  | 226 | somesubject4 | 2013-07-01 22:01:29 |  0 | 
+0

你可以使用示例数据和期望的结果来填写此内容并发布更新的提琴吗? http://sqlfiddle.com/#!2/ac316 - 这将帮助我们得到您的答案。 – sgeddes

+2

您能不能在已知托管恶意软件的网站上发布图像? http://google.com/safebrowsing/diagnostic?site=radikal.ru/ – Oerd

+0

sgeddes已更新。 Oerd对不起,它只是一个托管的图像应该没有恶意软件 – Alekso

回答

0

你可以使用此查询获取两个用户之间的最大created_on日期:

SELECT 
    LEAST(from_user, to_user) user1, 
    GREATEST(from_user, to_user) user2, 
    MAX(created_on) max_created_on 
FROM 
    tbl_message 
GROUP BY 
    LEAST(from_user, to_user), 
    GREATEST(from_user, to_user) 

,你正在寻找的查询大概是这样的:

SELECT t.* 
FROM 
    tbl_message t INNER JOIN (
    SELECT 
     LEAST(from_user, to_user) user1, 
     GREATEST(from_user, to_user) user2, 
     MAX(created_on) max_created_on 
    FROM 
     tbl_message 
    WHERE from_user=68 or to_user=68 
    GROUP BY 
     LEAST(from_user, to_user), 
     GREATEST(from_user, to_user)) M 
    on t.created_on = M.max_created_on 
    AND LEAST(t.from_user, t.to_user)=user1 
    AND GREATEST(t.from_user, t.to_user)=user2 

既见小提琴查询here

+0

它适用于MySQL? – Alekso

+0

@Alekso是的,请看这个小提琴http://sqlfiddle.com/#!2/4b7383/2 – fthiella

+0

grazie mille!:)非常感谢你这是工作,只是为了澄清功能将如何影响性能? – Alekso