Mysql 从行中选择上一条记录

Mysql 从行中选择上一条记录,mysql,sql,mysqli,Mysql,Sql,Mysqli,范例 id |u_id 1 | 1 2 | 1 3 | 2 4 | 1 5 | 2 6 | 3 我知道,id4的u id值为1,但我想选择在id4之前具有u id1的最后一行,即我想选择具有id2的行 请注意,我不知道这个id 我怎样才能做到这一点 结果应该是这样的: id |u_id 2 | 1 4 | 1 这可能对你有帮助 SELECT * FROM ( SELECT * FROM yourTable WHERE u_id=1 ORDER

范例

id |u_id
 1 |  1 
 2 |  1 
 3 |  2 
 4 |  1 
 5 |  2 
 6 |  3 
我知道,
id
4的
u id
值为1,但我想选择在
id
4之前具有
u id
1的最后一行,即我想选择具有
id
2的行

请注意,我不知道这个
id

我怎样才能做到这一点

结果应该是这样的:

id |u_id 
 2 |  1
 4 |  1
这可能对你有帮助

 SELECT * FROM ( SELECT  * FROM yourTable WHERE u_id=1 ORDER BY id DESC LIMIT 2) AS tab ORDER BY tab.id ASC
正如你的标题所述:

从行中选择上一条记录

下面给出了
2
之前出现的每一行,并且将处理的不仅仅是示例中显示的数据:

SELECT *
FROM example
WHERE id IN (
    SELECT id - 1
    FROM example
    WHERE u_id = 2);


终于找到了正确的sql查询

SELECT * FROM table WHERE u_id = 1 AND (id = 4 OR id < 4) ORDER BY id DESC LIMIT 0,2
从u_id=1和(id=4或id<4)按id DESC LIMIT 0,2排序的表中选择*

如果您使用的是较新版本的MySQL,那么您需要的是LAG()窗口函数:

SELECT  id,
        u_id,
        LAG(id) OVER W AS prev_id
FROM MyTable
WINDOW w AS (PARTITION BY u_id ORDER BY id)
ORDER BY id, u_id;
它将产生如下结果:

id |u_id |prev_id
 1 |  1  | null
 2 |  1  |  1
 3 |  2  | null
 4 |  1  |  2
 5 |  2  |  3
 6 |  3  | null

您可以使用查询。

u\u id=1将结果限制为仅一行。查询的
order by id desc
部分将变得多余。这是不正确的,根据示例数据,u_id=1将返回(1,1)、(2,1)和(4,1),order by id desc用于选择前两个最大的id,即(2,1)和(4,1)my bad。我把它看作id而不是u_id。让我试试,看看会发生什么。感谢您在给出您要查找的行的同时,硬编码
u\u id=1
,请查看我的答案,您不需要知道
u\u id
的值,该值位于
2
之前。我尝试运行您的查询,但它将其标记为错误查询。我不知道为什么。我的查询使用
example
作为表名。如果需要,可以将其更改为自己的表名。你运行演示了吗?是的,我运行了,我遇到了一些错误,我不知道如何修复
id-1
不是演示的一部分request@Strawberry我听到了。老实说,我应该把这个问题标记为不清楚,然后继续。这可能是有很多答案的原因,其中一些答案并不能解决很多难题(使用“限制”过滤掉边缘情况)。就标题而言,如果未来的访问者有问题需要解决,并将其放在这个问答页面上,他们可能会受益于我的简单方法。还有待观察OP是否选择了正确的答案(因为他们已经将答案贴到了自己的问题上,并且也没有标记)。不清楚您是否知道id(4)或u_id(1)。请注意,前者的可能性更大。再次您好!如果你在这里发现了一个有用的答案,请不要忘记接受一个并投票支持它。这样做,你和他们都获得了积极的声誉,这有助于未来的访问者确定哪个答案最合适/最有帮助。如果您对此有任何疑问,请查看以下链接:
id |u_id |prev_id
 1 |  1  | null
 2 |  1  |  1
 3 |  2  | null
 4 |  1  |  2
 5 |  2  |  3
 6 |  3  | null