我有一个表格,看起来像这样:
+----------+----------+-------------+
| 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)