Mysql 获取特定用户类型的最后回复的SQL

Mysql 获取特定用户类型的最后回复的SQL,mysql,sql,Mysql,Sql,我需要的目标是获得最后一个回复来自用户而不是管理员,并且最后一个回复是10天或更长时间的罚单。我目前有一个SQL,可以得到最后一个回复,但我很难从管理员那里筛选用户。我目前的SQL是: SELECT t.tid, tr.reply_date, tr.rid, u.display_name, u.user_type FROM ticket t JOIN ( SELECT tr_last.tid, tr_last.reply_date, tr_last.rid, t

我需要的目标是获得最后一个回复来自用户而不是管理员,并且最后一个回复是10天或更长时间的罚单。我目前有一个SQL,可以得到最后一个回复,但我很难从管理员那里筛选用户。我目前的SQL是:

SELECT
    t.tid, tr.reply_date, tr.rid, u.display_name, u.user_type
FROM ticket t
JOIN (
    SELECT 
        tr_last.tid, tr_last.reply_date, tr_last.rid, tr_last.uid
    FROM ticket_reply tr_last 
    ORDER BY tr_last.reply_date DESC
) tr ON tr.tid = t.tid
LEFT JOIN user u ON u.uid = tr.uid
WHERE 
    t.status != "Closed"
    AND DATE_SUB(CURDATE(), INTERVAL 10 DAY) >= tr.reply_date
GROUP BY t.tid;
这将返回类似于:

+-------+---------------------+-------+-----------------------------+-----------+
| tid   | reply_date          | rid   | display_name                | user_type |
+-------+---------------------+-------+-----------------------------+-----------+
|  6784 | 2012-03-27 04:11:52 | 40061 | (hidden)                    | admin     |
|  8094 | 2013-01-18 21:13:56 | 65037 | (hidden)                    | admin     |
|  8165 | 2012-09-10 14:59:17 | 52956 | (hidden)                    | admin     |
|  8171 | 2012-06-18 19:05:19 | 46527 | (hidden)                    | user      |
|  8313 | 2012-08-16 23:05:51 | 51362 | (hidden)                    | admin     |
|  8436 | 2012-08-16 23:20:20 | 51368 | (hidden)                    | admin     |
|  8453 | 2012-06-26 23:41:37 | 47247 | (hidden)                    | admin     |
|  8712 | 2012-11-22 10:33:05 | 59697 | (hidden)                    | user      |
|  8911 | 2013-09-24 00:52:27 | 89910 | (hidden)                    | user      |
|  8949 | 2013-09-02 16:29:22 | 87718 | (hidden)                    | user      |
+-------+---------------------+-------+-----------------------------+-----------+
如果我在
WHERE
子句中添加
u.user\u type=“user”
,它会更改它检索的
tr
中的哪一行,因此来自
6784
tid
行的用户现在显示的用户不是管理员,但该票据的最后回复实际上是管理员。因此:

SELECT
    t.tid, tr.reply_date, tr.rid, u.display_name, u.user_type
FROM ticket t
JOIN (
    SELECT 
        tr_last.tid, tr_last.reply_date, tr_last.rid, tr_last.uid
    FROM ticket_reply tr_last 
    ORDER BY tr_last.reply_date DESC
) tr ON tr.tid = t.tid
LEFT JOIN user u ON u.uid = tr.uid
WHERE 
    t.status != "Closed"
    AND DATE_SUB(CURDATE(), INTERVAL 10 DAY) >= tr.reply_date
    AND u.user_type = "user"
GROUP BY t.tid;
现在返回以下内容:

+-------+---------------------+-------+-----------------------------+-----------+
| tid   | reply_date          | rid   | display_name                | user_type |
+-------+---------------------+-------+-----------------------------+-----------+
|  6784 | 2012-03-26 23:19:52 | 40051 | (hidden)                    | user      |
|  8094 | 2013-01-18 18:53:33 | 65016 | (hidden)                    | user      |
|  8165 | 2012-09-07 01:17:28 | 52831 | (hidden)                    | user      |
|  8171 | 2012-06-18 19:05:19 | 46527 | (hidden)                    | user      |
|  8313 | 2012-08-09 18:37:35 | 50776 | (hidden)                    | user      |
|  8436 | 2012-08-16 23:01:28 | 51359 | (hidden)                    | user      |
|  8453 | 2012-06-21 16:29:24 | 46843 | (hidden)                    | user      |
|  8712 | 2012-11-22 10:33:05 | 59697 | (hidden)                    | user      |
|  8911 | 2013-09-24 00:52:27 | 89910 | (hidden)                    | user      |
|  8949 | 2013-09-02 16:29:22 | 87718 | (hidden)                    | user      |
+-------+---------------------+-------+-----------------------------+-----------+
您可以注意到,
rid
列的值也不同


所以我的问题是,我如何正确地返回用户呢?

你不会得到最后的回复。在子查询中,您只是对值进行排序

试着这样做:

SELECT t.tid, tr.reply_date, tr.rid, u.display_name, u.user_type
FROM ticket t
INNER JOIN (
  SELECT tr_last.tid, tr_last.reply_date, tr_last.rid, tr_last.uid
  FROM ticket_reply tr_last
  INNER JOIN (
    SELECT tid, max(reply_date)
    FROM ticket_reply
    GROUP BY tid
    ) tr2 ON tr2.tid = tr_last.tid AND tr_last.reply_date = tr2.reply_date
  ) tr ON tr.tid = t.tid
LEFT JOIN user u ON u.uid = tr.uid AND u.user_type = "user"
WHERE t.STATUS != "Closed"
  AND DATE_SUB(CURDATE(), INTERVAL 10 DAY) >= tr.reply_date;
内部查询返回tid及其最大值(日期),并提供最新的回复信息


(我没有对此进行测试,但看起来像您正在寻找的)。

如果您不太关心性能,请添加
让u.user\u type=“user”
发现我实际上在
和DATE\u SUB(CURDATE(),间隔10天)上也有同样的问题>=tr.reply_date
所以它实际上并没有返回上一个reply-post示例数据和预期结果,或者(甚至更好)将其设置为。正是我想要的,只是做了一个小的调整
MAX(reply_date)作为reply_date