我的目标是从每个帐户的表中获取最后几行(我正在尝试三行)。我不难拿到第一排,但我很难进入最近的前三排。例如,假设我有下表:

+--------+------------+------------+-----------+
| 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/

10-13 04:43
查看更多