Mysql 根据某些标准,检索每组的最后记录
我试图编写一个sql请求来查找每个组的最后一条记录,这是我的表的布局:Mysql 根据某些标准,检索每组的最后记录,mysql,sql,Mysql,Sql,我试图编写一个sql请求来查找每个组的最后一条记录,这是我的表的布局: -------------------------------------- | id | Group | message | Status | date| ------------------------------------- | 1 | A | msg1 | sent | dt | ------------------------------------- | 2 | A | m
--------------------------------------
| id | Group | message | Status | date|
-------------------------------------
| 1 | A | msg1 | sent | dt |
-------------------------------------
| 2 | A | msg2 |deferred| dt2 |
-------------------------------------
| 3 | B | msg3 |deferred| dt |
-------------------------------------
| 4 | B | msg4 |deferred| dt |
-------------------------------------
| 5 | B | msg5 |Bounced | dt |
-------------------------------------
| 6 | C | msg6 |sent | dt |
-------------------------------------
| 7 | D | msg7 |deferred| dt |
-------------------------------------
| 8 | D | msg8 |deferred| dt |
-------------------------------------
| 9 | D | msg9 |sent | dt |
-------------------------------------
我试图得到这个输出:
--------------------------------------
| id | Group | message | Status | date|
-------------------------------------
| 2 | A | msg2 |deferred| dt |
-------------------------------------
| 5 | B | msg5 |bounced | dt |
-------------------------------------
| 8 | D | msg8 |deferred| dt |
-------------------------------------
这意味着,对于每个组,我希望使用我在表中的日期,得到最后一条延迟或反弹的消息。
我开始做这个请求,但我不知道如何修改它以获得我想要的结果:
SELECT ee.Group, ee.message
FROM email_errors ee
LEFT JOIN email_errors ee2 ON ( ee.Group = ee2.Group
AND ee.id < ee2.id )
WHERE ee2.id IS NULL
AND ee2.status <>0
我注意到ee.status 0,因为在我的实际表中,我替换了3个可能的状态bu 0,1,2,并将发送状态替换为0。我将执行以下操作:
SELECT ee.*
FROM email_errors as ee
CROSS JOIN
(
SELECT ee.Group as grp, MAX(ee.id) AS max_id
FROM email_errors as ee
CROSS JOIN
(
SELECT Group as grp, MAX(date_t) AS max_date
FROM email_errors
WHERE status <> 0
GROUP BY Group
) aux
WHERE ee.Group = aux.grp
AND ee.date_t = aux.max_date
GROUP BY ee.Group
) outer_aux
WHERE ee.Group = outer_aux.grp
AND ee.id = outer_aux.max_id
请注意,group在MySQL中是一个保留字-所以对于列来说不是一个好名字
SELECT x.*
FROM email_errors x
JOIN
( SELECT email_group
, MAX(id) max_id
FROM email_errors
WHERE status IN ('deferred','bounced')
GROUP
BY email_group
) y
ON y.email_group = x.email_group
AND y.max_id = x.id;
是的,我看到了,但在这里我被阻止了,因为我必须根据我的状态和日期选择最后一条记录,这就是我不知道如何写入它的原因。您的表中没有日期。此查询不包含任何关于日期的子句@Ahmadhc:表中条目的权杖是基于ID还是基于日期?不,我使用日期来确定我的最后一条记录@在您的示例中,日期都是值为“dt”的字符串。我不能那样做。此查询是最佳解决方案。根据需要对其进行修改。