我有一个简单的表格设置see fiddle

    CREATE TABLE mytable
    (`id` int, `itemid` int);

    INSERT INTO mytable
    (`id`, `itemid`)
    VALUES
    (1, 111),
    (2, 222),
    (3, 333),
    (4, 444),
    (5, 111),
    (6, 222),
    (7, 333),
    (8, 564),
    (9, 111),
    (10, 121),
    (11, 131),
    (12, 111),
    (13, 353),
    (14, 373);

我想显示当前行itemid旁边的行中最后一个itemid是什么。
我已经用下面的
    SELECT
    mt.id,
    mt.itemid,
    (
        select mt2.itemid
        from mytable mt2
        where mt2.id < mt.id
        ORDER BY mt2.id DESC
        LIMIT 1
    ) as lastitemid
     FROM mytable mt
     ORDER BY id DESC
     LIMIT 5

如期返回
    ID  ITEMID  LASTITEMID
    14  373     353
    13  353     111
    12  111     131
    11  131     121
    10  121     111

但是我只想显示lastitemid=111的行。
我试过了
    SELECT
    mt.id,
    mt.itemid,
    (
        select mt2.itemid
        from mytable mt2
        where mt2.id < mt.id
        ORDER BY mt2.id DESC
        LIMIT 1
    ) as lastitemid
    FROM mytable mt
    WHERE lastitemid = 111
    ORDER BY id DESC
    LIMIT 5

在“where子句”中获取未知列“lastitemid”
我也试着补充
    AND mt2.itemid = 111

到内部查询
这不会得到任何错误,但对于所有行返回111,这不是我想要的,因为它是无效的,例如对于id=12,lastitemid是131,但它显示111
    ID  ITEMID  LASTITEMID
    14  373     111
    13  353     111
    12  111     111
    11  131     111
    10  121     111

对于我的示例数据集,如果我有查询权,我应该得到以下结果
    ID  ITEMID  LASTITEMID
    13  353     111
    10  121     111
    6   222     111
    2   222     111

我怎样才能做到这一点?

最佳答案

试试这个:

SELECT mt.id, mt.itemid,
      (SELECT mt2.itemid FROM mytable mt2 WHERE mt2.id < mt.id ORDER BY mt2.id DESC LIMIT 1) AS lastitemid
FROM mytable mt
HAVING lastitemid = 111
ORDER BY id DESC
LIMIT 5

检查SQL FIDDLE DEMO
输出
| ID | ITEMID | LASTITEMID |
|----|--------|------------|
| 13 |    353 |        111 |
| 10 |    121 |        111 |
|  6 |    222 |        111 |
|  2 |    222 |        111 |

09-25 21:28