【问题标题】:SQL - joining dataSQL - 连接数据
【发布时间】:2012-01-14 23:25:06
【问题描述】:

如果我需要来自 3 个表的数据,是否可以获得 1 个结果。

第一个表:我需要获取所有字段(通过主键找到的 1 行)

第二张表:我需要获取“用户名”字段(通过“master_id”连接到第一张表)

第三张表:我需要使用关联的 master_id 键获取最新添加的行(表有 'date'、'master_id'、'previous_name')。

【问题讨论】:

    标签: mysql sql join


    【解决方案1】:
    select top 1 first.*, second.username, third.*
    from first 
    inner join second on first.id = second.master_id
    inner join third on first.id = third.master_id
    order by
    third.date desc
    

    与往常一样,给猫剥皮的方法有很多种,我不确定这是否作为子查询方法进行了优化,但它应该可以工作。

    【讨论】:

    • 哦,只有一排!打得好,先生!
    【解决方案2】:

    您可以将三个表连接在一起。然后,您可以使用“过滤器”连接来仅保留最新的 Table3 行:

    select  *
    from    Table1 t1
    join    Table2 t2
    on      t2.master_id = t1.master_id
    join    Table3 t3
    on      t3.master_id = t1.master_id
    join    (
            select  master_id
            ,       max(date) as max_date
            from    Table3
            group by
                    master_id
            ) as filter
    on      t3.master_id = filter.master_id
            and t3.date = filter.max_date
    

    【讨论】:

      【解决方案3】:

      您将需要第三个表的相关子查询。

      SELECT t1.*, username, date, previous_name
      FROM FirstTable t1
      INNER JOIN SecondTable t2 ON t1.master_id=t2.master_id
      INNER JOIN 
      (SELECT master_id, date, previous_name
       FROM ThirdTable AS t3_1
       WHERE date = (
            SELECT MAX(date) 
            FROM ThirdTable AS t3_2 
            WHERE t3_2.master_id=t3_1.master_id)) q1 ON q1.master_id=t1.master_id;
      

      注意:未经测试。

      【讨论】:

      • 不相关的子查询也有效,请参阅我的回答。对于少量行,相关查询应该会做得更好,尤其是在 master_id 上有索引时。
      猜你喜欢
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      相关资源
      最近更新 更多