我的目标是从每个帐户的表中获取最后几行(我正在尝试三行)。我不难拿到第一排,但我很难进入最近的前三排。例如,假设我有下表:
+--------+------------+------------+-----------+
| rownum | entryDate | particular | accountID |
+--------+------------+------------+-----------+
| 1 | 2015-10-01 | Item1 | 1 |
| 2 | 2015-10-01 | Item2 | 1 |
| 3 | 2015-10-02 | Item3 | 1 |
| 4 | 2015-10-02 | Item4 | 1 |
| 5 | 2015-10-02 | Item5 | 2 |
| 6 | 2015-10-03 | Item6 | 2 |
| 7 | 2015-10-05 | Item7 | 3 |
+--------+------------+------------+-----------+
我想得到的是:
+--------+------------+------------+-----------+
| rownum | entryDate | particular | accountID |
+--------+------------+------------+-----------+
| 4 | 2015-10-02 | Item4 | 1 |
| 3 | 2015-10-02 | Item3 | 1 |
| 2 | 2015-10-01 | Item2 | 1 |
| 6 | 2015-10-03 | Item6 | 2 |
| 5 | 2015-10-02 | Item5 | 2 |
| 7 | 2015-10-05 | Item7 | 3 |
+--------+------------+------------+-----------+
其中,
Item1
被删除,因为它之前已经有3个。我试过下面的代码,但它没有检索到最近的
select rownum, entryDate, particular, accountID
from (
select entryDate, particular, accountID
@rownum := if(@account = accountID, @rownum + 1, 1) rownum,
@account := accountID
from entries
join ( select @rownum := 0, @account := 0 ) init
order by accountID, entryDate desc) t
where t.rownum <= 3 -- Limits the rows per account
如果有人能给我指一个正确的方向那就太好了!
编辑:
然而,我得到的结果是:
+--------+------------+------------+-----------+
| rownum | entryDate | particular | accountID |
+--------+------------+------------+-----------+
| 3 | 2015-10-02 | Item3 | 1 |
| 2 | 2015-10-01 | Item2 | 1 |
| 1 | 2015-10-01 | Item1 | 1 |
| 6 | 2015-10-03 | Item6 | 2 |
| 5 | 2015-10-02 | Item5 | 2 |
| 7 | 2015-10-05 | Item7 | 3 |
+--------+------------+------------+-----------+
另外,如果有帮助的话,我在MySQL工作台、SQLbuddy、PHP(web应用程序)和PHPMyAdmin上测试过,它们都会产生相同的结果
最佳答案
Your query works for me如果我修复了语法错误。
select rownum, entryDate, particular, accountID
from (
select entryDate, particular, accountID,
@rownum := if(@account = accountID, @rownum + 1, 1) rownum,
@account := accountID
from entries
join ( select @rownum := 0, @account := 0 ) init
ORDER BY accountid, entryDate desc
) t
where t.rownum <= 3;
rownum entryDate particular accountID
1 October, 02 2015 Item3 1
2 October, 02 2015 Item4 1
3 October, 01 2015 Item1 1
1 October, 03 2015 Item6 2
2 October, 02 2015 Item5 2
1 October, 05 2015 Item7 3
注意,Item1和Item2具有相同的entryDate。你会得到第1、3和4项还是第2、3和4项是不可预测的。然而,你不应该得到第1,2和3项。
还要注意
rownum
不是1到7,而是每个帐户分别递增。这是正确的。同一查询的输出不同。我想我知道发生了什么。您非常聪明的子查询依赖于子选择中列的操作顺序。尤其是这个。
@rownum := if(@account = accountID, @rownum + 1, 1) rownum,
@account := accountID
这就是为每个帐户分配一组单独的rownum的诀窍。它依赖于这样一个事实:行是按帐户排序的,并且
@rownum
是在@account
之前设置的。问题是,我认为你不能相信。
关于mysql - 如何在MySQL中获取最后三行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33459693/