【问题标题】:MySQL join 2 tables on non-unique column and with timestamp conditionsMySQL 在非唯一列和时间戳条件下加入 2 个表
【发布时间】:2014-08-09 06:47:54
【问题描述】:

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

每个表的所有条目都有“时间戳”列。

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

我想要做的只是列出所有的parts_revisions,但使用基于parts_revisions 中categoryId 列的categories_revisions 表中的人性化“名称”列。这将使日志更具可读性。

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

【问题讨论】:

  • 我相信发布这两个表的结构会更容易(至少对我来说),甚至更好,构建一个sqlFiddle here
  • @hex494D49 ,是的,我明白了。好吧,取决于我是否得到很多反馈(或者我自己没有弄清楚),我可能会更新这个问题。感谢您的输入

标签: mysql


【解决方案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

【讨论】:

  • 感谢@hex494D49 将我指向SQL Fiddle。很棒的工具。
  • Jenkies Velma,我们现在很摇滚。是的,这让我觉得效率高不高,但是,嘿,它有效!现在已经足够好了。谢谢你。附言您几乎确定了表格结构,我知道我的问题有点冗长。干得好。
  • 只是想说我将使用此代码归属于您,除非您需要它。
  • 我不需要它。这是一个周五下午的有趣谜题。很高兴它对你有用。
猜你喜欢
  • 2021-01-26
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
相关资源
最近更新 更多