在MySQL中对左连接行进行优先级排序
我正在处理MySQL5.5中一些稍微有点古怪的数据。我有一个表,用于跟踪新状态、活动状态、非活动状态等以及位置更改,其中位置的格式为x.0.y,x和y为正整数 我试图将位置更改移动到一个单独的表中,但为此,我需要从表中的其他记录中恢复完整的旧位置。完整的旧位置未存储在位置更改记录中,如下所示:在MySQL中对左连接行进行优先级排序,mysql,join,Mysql,Join,我正在处理MySQL5.5中一些稍微有点古怪的数据。我有一个表,用于跟踪新状态、活动状态、非活动状态等以及位置更改,其中位置的格式为x.0.y,x和y为正整数 我试图将位置更改移动到一个单独的表中,但为此,我需要从表中的其他记录中恢复完整的旧位置。完整的旧位置未存储在位置更改记录中,如下所示: id status new_loc timestamp -- ------ ------- --------- 5 1 -> 1
id status new_loc timestamp
-- ------ ------- ---------
5 1 -> 1 1.0.2 2012-05-21 00:00:00
5 new 1.0.1 2012-05-21 00:00:03
5 1 -> 2 2.0.1 2012-05-22 00:00:00
5 2 -> 3 3.0.1 2012-05-23 00:00:00
因此,当发生位置更改时,所记录的只是完整的新位置和状态消息左侧的旧位置的第一部分。但是,我可以查看以前的记录,找到完整的旧位置
我的主要问题是那里的第二排。新状态表示id为5的对象刚刚添加到数据库中。它应该始终是表中任何id的第一个状态。然而,在许多情况下,新记录是在初始更改记录之后大约三秒钟插入的。在本例中,它添加了位置1.0.1,然后更改为1.0.2,然后更改为2.0.1,然后更改为3.0.1。编辑:真实的例子并不是这么简单或直接,但总有一条路径的位置,一个人可以相当容易地识别
我在尝试编写同时考虑第1行和第3行的查询时遇到问题。我找不到最新的唱片,因为它们可能有问题。我不能用与我的状态匹配的新位置抓取记录,因为可能有多个匹配项
以下是我认为有效的方法:
查找最近的先前位置更改(如果存在),并使用其新位置。
如果不存在以前的更改,请查找具有该id的新状态的记录,并使用其新位置。
我目前有一个左连接,它与这两个条件都匹配,但我不知道如果没有任何匹配条件1或更喜欢在条件1上连接的行,如何在条件2上说“仅连接”
我就是不知道怎么做。感谢您的帮助
编辑:我应该明确id是一个对象id,而不仅仅是这个表上的索引。主键是id和status。让我确认一下,我明白您的意图。在伪代码中,这是否符合您的要求
given
table A (as in your answer)
table B (objectid, old, new)
for any `id`
get all rows
order rows by `status` column such that 'new' is the first value, and then numerically
take the location in the first `status` column c and insert it into table B with values id, 'new', (c).location
for all remaining `status` fields selected:
for any field n, insert into table B with values id, (n-1).location, (n).location
这在存储过程中应该是可能的……但编写代码可能会有点痛苦 让我确认一下,我明白你想做什么。在伪代码中,这是否符合您的要求
given
table A (as in your answer)
table B (objectid, old, new)
for any `id`
get all rows
order rows by `status` column such that 'new' is the first value, and then numerically
take the location in the first `status` column c and insert it into table B with values id, 'new', (c).location
for all remaining `status` fields selected:
for any field n, insert into table B with values id, (n-1).location, (n).location
这在存储过程中应该是可能的……但编写代码可能会有点痛苦 位置是否单调增加?如果是这样,您可以按位置或其片段排序,以确定当前位置之前的位置。不,不幸的是,没有类似的押韵或原因,位置字符串是任意的,更改是随机的。我之所以选择这些例子,是因为它们更容易理解,同时又能保持结构。位置是否单调增加?如果是这样,您可以按位置或其片段排序,以确定当前位置之前的位置。不,不幸的是,没有类似的押韵或原因,位置字符串是任意的,更改是随机的。我之所以选择这些例子,是因为它们更容易理解,同时仍然保持了结构。