Python SQLAlchemy 获取匹配的行和下一行,其中列是相同的



我有一个表格,看起来像这样:

+----------+----------+-------------+
| id       | name     | date        |   
+----------+----------+-------------+
| 1        | John     | 2018-08-21  |
+----------+----------+-------------+
| 2        | James    | 2018-08-22  |
+----------+----------+-------------+
| 3        | John     | 2018-08-22  |
+----------+----------+-------------+
| 4        | Paul     | 2018-08-23  |
+----------+----------+-------------+

我正在寻找一个查询,当您选择id = 1时,它将返回:

+----------+----------+-------------+
| id       | name     | date        |   
+----------+----------+-------------+
| 1        | John     | 2018-08-21  |
+----------+----------+-------------+
| 3        | John     | 2018-08-22  |
+----------+----------+-------------+

但是当你选择id = 2你会得到:

+----------+----------+-------------+
| id       | name     | date        |   
+----------+----------+-------------+
| 2        | James    | 2018-08-22  |
+----------+----------+-------------+

因此,换句话说,查询应该返回匹配的行id和名称相同的下一行。

我会在sqlalchemy年完成这项工作. 所有的帮助都表示赞赏。

使用关系数据库就是要了解没有下一行,没有预设顺序。您需要通过排序来请求特定订单,然后根据需要按该顺序获取任意数量的记录。

在这种情况下,您使用例如.filter(the_table.c.name == "John"),然后.order_by("id", "name"),然后.limit(2)。如果获取了两行,则有两条记录与您的约束匹配。可以没有记录,也可以只有一个记录。

如果你有多个 John 的记录集,并且想要一个特定的子序列,事情就会变得更加棘手。为此,您可以添加一个条件,例如the_table.c.id >= certain_id,或类似的日期。

通常,您的数据模型缺少将多个记录链接到一个序列的显式方法。您没有"序列 ID"或"以前的记录 ID",或类似的东西,可以帮助查看多个相关的记录。也许您可以使用时间戳列,如果它适合您的问题;它很可能没有。

看到您的尝试后,提供答案会容易得多。以下是可能有助于您理解的代码片段

subquery = session.query(Person.name.label('name')).subquery()
main_query = session.query(Person).join(subquery, Person.name==subquery.c.name).filter(Person.id==2).
order_by(Person.id).limit(2)

更简洁的方法将涉及两次查询

get_name = session.query(Person).filter(Person.id==1).first()[0]
get_all_rows =session.query(Person).filter(Person.name==get_name).order_by(Person.id).limit(2)

最新更新