MySQL在非唯一列和时间戳条件下连接2个表

时间:2014-08-08 22:05:35

标签: mysql

我有2个MySQL表:“parts_revisions”和“categories_revisions”。我的目标是使用这些表中的修订数据来创建一个日志,列出对零件和类别所做的所有更改。在单个SQL语句中列出对“parts”的更改已被证明是棘手的!情况如下:

每个表的所有条目都有“timestamp”列。

每个parts_revisions条目都有一个“categoryId”,它基本上将它链接到categories_revisions表。 (每个部分都是父类别的孩子。)

我想要做的就是列出所有parts_revisions,但是根据parts_revisions中的categoryId列,使用categories_revisions表中的人性化“name”列。这将使日志更具可读性。

诀窍在于,因为categories_revisions表中的每个类别通常都有多个修订版,所以我不能只在categoryId列上进行一次大的连接来获取名称。 categoryId列是非唯一的,“name”可能会有所不同。我要做的是获取最新 category_revisions条目,该条目的时间戳不迟于 part_revisions条目的时间戳。换句话说,我们希望获得正在使用的部件名称,该部分名称正在进行部件修订。

1 个答案:

答案 0 :(得分:1)

不确定这是否与您的桌面结构相符,但现在就去了。它在子查询中有点丑陋的子查询。猜测它不会非常有效

select part_name, 
       category,
       (select name
          from categories_revisions
         where categories_revisions.match_id = parts_revisions.category 
           and categories_revisions.timestamp = (select MAX(categories_revisions.timestamp) 
                                   from categories_revisions 
                          where categories_revisions.match_id = parts_revisions.category
                            and categories_revisions.timestamp < parts_revisions.timestamp)) as name
   from parts_revisions;

http://sqlfiddle.com/#!2/da74e/1/0