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