在MySQL中对左连接行进行优先级排序

在MySQL中对左连接行进行优先级排序,mysql,join,Mysql,Join,我正在处理MySQL5.5中一些稍微有点古怪的数据。我有一个表,用于跟踪新状态、活动状态、非活动状态等以及位置更改,其中位置的格式为x.0.y,x和y为正整数 我试图将位置更改移动到一个单独的表中,但为此,我需要从表中的其他记录中恢复完整的旧位置。完整的旧位置未存储在位置更改记录中,如下所示: id status new_loc timestamp -- ------ ------- --------- 5 1 -> 1

我正在处理MySQL5.5中一些稍微有点古怪的数据。我有一个表,用于跟踪新状态、活动状态、非活动状态等以及位置更改,其中位置的格式为x.0.y,x和y为正整数

我试图将位置更改移动到一个单独的表中,但为此,我需要从表中的其他记录中恢复完整的旧位置。完整的旧位置未存储在位置更改记录中,如下所示:

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

这在存储过程中应该是可能的……但编写代码可能会有点痛苦

位置是否单调增加?如果是这样,您可以按位置或其片段排序,以确定当前位置之前的位置。不,不幸的是,没有类似的押韵或原因,位置字符串是任意的,更改是随机的。我之所以选择这些例子,是因为它们更容易理解,同时又能保持结构。位置是否单调增加?如果是这样,您可以按位置或其片段排序,以确定当前位置之前的位置。不,不幸的是,没有类似的押韵或原因,位置字符串是任意的,更改是随机的。我之所以选择这些例子,是因为它们更容易理解,同时仍然保持了结构。