【问题标题】:Creating a mysql table view that "merges" two columns from a table depending on its values and select its most recent date from a DateTime type column创建一个 mysql 表视图,根据其值“合并”表中的两列,并从 DateTime 类型列中选择其最近的日期
【发布时间】:2021-04-21 03:30:43
【问题描述】:

我有一个这样的 MySQL 数据库表:

ID ref_A ref_B ref_Id dateLog
1 5 2 XX 2019-12-20
2 2 5 XX 2020-12-25
3 5 2 XX 2021-04-01
4 3 2 YY 2021-04-12
5 2 3 YY 2021-04-13

我想创建一个表格视图,将两列之间的组合视为唯一的“关系”,并选择其最近出现的日期。我们在上面看到“5”和“2”之间的组合重复了3次,即使是数千个组合,我也需要将其视为1个单一关系,就好像我在说(2是参与事件XX,5是参加活动 XX, 2 也参加活动 YY...等)并且还有最后一次发生的日期,所以我想要的表格视图是:

ref_Combined ref_Id lastUpdate
5 XX 2021-04-01
2 XX 2021-04-01
3 YY 2021-04-13
2 YY 2021-04-13

我不知道如何在“CREATE VIEW vw_Table AS (...)”中安装选择。有人可以帮忙吗?

【问题讨论】:

    标签: mysql sql database mariadb


    【解决方案1】:

    我不确定您为什么希望结果为两行,而不是一行。所以,我会推荐:

    select least(ref_A, ref_B), greatest(ref_A, ref_B), ref_id,
           max(date_log)
    from t
    group by least(ref_A, ref_B), greatest(ref_A, ref_B), ref_id;
    

    如果你想要一个特定的 id,然后添加:

    where 5 in (ref_A, ref_B)
    

    如果你真的需要这个 unpivot,你可以使用:

    select least(ref_A, ref_B) as ref_Combined, ref_id, max(date_log)
    from t
    group by least(ref_A, ref_B), greatest(ref_A, ref_B), ref_id
    union all
    select greatest(ref_A, ref_B) as ref_Combined, ref_id, max(date_log)
    from t
    group by least(ref_A, ref_B), greatest(ref_A, ref_B), ref_id;
    

    【讨论】:

    • 嗨,戈登。谢谢您的回答。我需要它,因为我会在结果中做这样的事情:select ref_id from T where ref_combined=5并获得“5”参与的所有关系。
    • @SandroBenevides 。 . .您可以使用where 子句检查5。这应该可以加快任何查询。
    • 但这会在每次用户使用自己的 ID 登录时在执行时完成,对吧?完成所有值的表格视图,等待寻找不会更快,因为表格视图已部分完成?
    • 我的意思是,表格视图是持久的(en.wikipedia.org/wiki/View_(SQL)),对吗?因此,查找 5 参与的 ref_id 比在整个主表中查找要快。我错了吗?
    • @SandroBenevides 。 . .这通常是正确的。
    【解决方案2】:
    SELECT LEAST(ref_a, ref_b) ref_Combined, 
           ref_Id,
           MAX(dateLog) lastUpdate
    FROM test
    GROUP BY LEAST(ref_a, ref_b), GREATEST(ref_a, ref_b), ref_id
    UNION ALL
    SELECT GREATEST(ref_a, ref_b), 
           ref_Id,
           MAX(dateLog)
    FROM test
    GROUP BY LEAST(ref_a, ref_b), GREATEST(ref_a, ref_b), ref_id
    ORDER BY ref_Id, ref_Combined DESC
    

    https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=80ed31679ba93fb8c7dc80c305854be0

    自己转换成视图——这项工作并不难。

    【讨论】:

      猜你喜欢
      • 2014-01-09
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      • 1970-01-01
      相关资源
      最近更新 更多