如何在按属性

时间:2018-06-15 16:59:05

标签: python mysql orm sqlalchemy

所以我正在尝试编写一个查询,它将选择在某个属性上不同的对象集合。

动作:

+-----+-----------+-----+
| 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 

1 个答案:

答案 0 :(得分:-1)

我不熟悉python,但如果我得到了你想要的东西,这里是SQL查询:

[]

它将为您提供每个动作行重复的每个版本的数据 这是一个SQL fiddle demo