所以我正在尝试编写一个查询,它将选择在某个属性上不同的对象集合。
动作:
+-----+-----------+-----+
| id | timestamp | ... |
+-----+-----------+-----+
| 10 | 16:04 | ... |
| 11 | 16:06 | ... |
| 12 | 16:08 | ... |
| 13 | 16:09 | ... |
| 14 | 16:10 | ... |
+-----+-----------+-----+
FooVersion:
+----+--------+-----------+-------------------+
| id | foo_id | action_id | foo_zab |
+----+--------+-----------+-------------------+
| 1 | 1 | 10 | xx |
| 2 | 2 | 11 | yy |
| 3 | 3 | 12 | zz |
| 4 | 3 | 13 | zy |
| 5 | 3 | 14 | zx |
+----+--------+-----------+-------------------+
富:
+----+-----+
| id | zab |
+----+-----+
| 1 | xx |
| 2 | yy |
| 3 | zx |
+----+-----+
场景由一组foos组成。我试图跟踪每个特定foo随时间的变化。因此,每次对foo进行更改时,都会记录导致该更改的操作,并且会将某些foo属性的副本存储在foo_versions
表中
我正在寻找的是“特定行动中的抱负的状态”。因此,虽然动作#11仅专门链接到foo,但动作#11中的场景状态实际上包含3个foos,其版本为foo_version#1,#2和#5
我需要构建一个查询,说“对于指定的动作,给我一个场景的表示”
对于动作#10,场景将是[<foo_version #1>]
对于动作#12,场景将是[<foo_version #1>, <foo_version #2>, <foo_version #3>]
这是棘手的地方。对于动作#14,场景的表示是[<foo_version #1>, <foo_version #2>, <foo_version #5>]
。 Foo版本#3,#4和#5都指向相同的foo。因此,foo版本#3和#4被#5覆盖。
我正在使用这个sqlalchemy查询:
stmt = db.session.query(Action).filter(Action.timestamp <= action.timestamp).subquery()
action_alias = aliased(Action, stmt)
foo_versions = db.session.query(FooVersion) \
.join(Action) \
.join(action_alias, FooVersion.action) \
.filter(Action.frame_id == frame.id) \
.all()
我得到的结果是
[<foo_version #1>, <foo_version #2>, <foo_version #3>, <foo_version #4>, <foo_version #5>]]]
|____________| |____________|
^ ^
| |
I need to get rid of these versions -> | |
since they have been overwritten
答案 0 :(得分:-1)