MySQL-查询不同ID的最后两条记录

时间:2019-05-07 12:54:49

标签: php mysql sql

如何按天获取每个team_id订单的最后两个职位?

position |  team_id |  day
------------------------------
 12  |  1  |  1
 21  |  1  |  2
 3   |  1  |  3
 4   |  1  |  4
 31  |  2  |  1
 6   |  2  |  2
 7   |  2  |  3
 21  |  3  |  1
 11  |  3  |  2
 10  |  3  |  3

我想获得这些行:

 3 1
 4 1
 6 2
 7 2
 11 3
 10 3

我尝试使用JOINS,选择IN(使用team_id作为唯一键),但是我无法识别查询。

3 个答案:

答案 0 :(得分:0)

在MySQL 8+中,您可以使用const { dialogflow, BasicCard, Image, Button } = require('actions-on-google'); 为按天降序排列的每个团队的每条记录分配编号。

row_number()

在较低版本中,您可以尝试计算比子查询中的当前行年轻的行。如果是最年轻的记录,它将是零,第二个最年轻的记录将是1。但是,这要求日子是唯一的。

SELECT x.team_id,
       x.position,
       x.day
       FROM (SELECT t.team_id,
                    t.position,
                    t.day,
                    row_number() OVER (PARTITION BY team_id
                                       ORDER BY day DESC) rn
                    FROM elbat t) x
       WHERE x.rn IN (1, 2);

答案 1 :(得分:0)

如果您想要最后两天-每个团队都有两天的时间-您可以这样做:

select t.*
from t
where t.day >= (select t2.day
                from t t2
                where t2.team_id = t.team_id
                order by t2.day desc
                offset 1 limit 1
               );

或者,如果您可以将数据放在一行中,则:

select team_id,
       substring_index(group_concat(position order by day desc), ',', 2) as positions
from t
group by team_id;

答案 2 :(得分:0)

检查是否存在具有相同的team_id但具有较高的day的两行:

select t.*
from tbl t
where not exists (
  select *
  from tbl t2
  where t2.team_id = t.team_id
    and t2.day > t.day
  limit 1 offset 1 -- get second row
)

您可以将子查询读取为:“对于同一团队,limit 1 offset 1比该团队更高的团队没有第二(day)行。”