【问题标题】:MySQL JOIN table based on MAX(date) in main table, and MAX(id) in joined table with LIMITMySQL JOIN 表基于主表中的 MAX(date),连接表中的 MAX(id) 与 LIMIT
【发布时间】:2015-05-24 12:33:05
【问题描述】:

如果标题没有任何意义,这就是我需要做的事情。我需要在主表中“按日期”选择最近的 X 条记录,然后加入属于的数据通过在连接表中选择“按 id”的最新记录来访问这些记录。

这是一些示例输出..

表:lead_unique(此表中只有唯一的 ssn)

+------------+-------------+ | ssn |创建日期 | +------------+-------------+ | 111111111 | 2015-03-01 | | 999999999 | 2015-03-03 | | 555555555 | 2015-02-08 | +------------+-------------+

表:lead_data

+----+------------+-------+----------------+-------- ------+-------+--------+ |编号 | ssn |姓名 |地址 |城市|状态 |拉链 | +----+------------+-------+----------------+-------- ------+-------+--------+ | 1 | 111111111 |鲍勃1 |第1234章土墩 |加利福尼亚州 | 55555 | | 2 | 111111111 |鲍勃2 |第1234章土墩 |加利福尼亚州 | 55555 | | 3 | 999999999 |简1 | 5432 洛拉大道 |巴顿 |新泽西州 | 33333 | | 4 | 999999999 |简2 | 5432 洛拉大道 |巴顿 |新泽西州 | 33333 | | 5 | 555555555 |杰克1 |第 92 大道北 832 号 |明亮的视野 |铝 | 88888 | | 6 | 999999999 |简3 | 5432 洛拉大道 |巴顿 |新泽西州 | 33333 | +----+------------+-------+----------------+-------- ------+-------+--------+

想要的输出(可以是 asc/desc 日期列,没关系)

+--------------+------------+-------+ |创建日期 | ssn |姓名 | +--------------+------------+-------+ | 2015-03-03 | 999999999 |简3 | | 2015-03-01 | 111111111 |鲍勃2 | | 2015-02-08 | 555555555 |杰克1 | +--------------+------------+-------+

期望的输出(限制 2)

+--------------+------------+-------+ |创建日期 | ssn |姓名 | +--------------+------------+-------+ | 2015-03-03 | 999999999 |简3 | | 2015-03-01 | 111111111 |鲍勃2 | +--------------+------------+-------+

查询可能类似于以下内容,但我也可能会因为我在这里寻求帮助而没有运气..

选择 Lead_unique.created_date, Lead_unique.ssn, 线索数据名称 从 铅独特 加入 ( 选择 ... 从 线索数据 ... ) 铅数据 ... ... 限制 2

我之前只使用过一次堆栈溢出,所以如果还有什么我可以添加以提供帮助的内容,请告诉我!谢谢!!

【问题讨论】:

    标签: mysql join limit


    【解决方案1】:

    我倾向于对数据块使用相关子查询——你的问题只提到一列:

    select u.created_date, u.ssn,
           (select d.name
            from lead_data d
            where d.ssn = u.ssn
            order by d.id desc
            limit 1
           ) as name
    from lead_unique u
    order by u.created_date desc
    limit 2;
    

    实际上,出于性能原因,我会将唯一组件放在子查询中:

    select u.created_date, u.ssn,
           (select d.name
            from lead_data d
            where d.ssn = u.ssn
            order by d.id desc
            limit 1
           ) as name
    from (select u.*
          from lead_unique u
          order by u.created_date desc
          limit 2
         ) u;
    

    编辑:

    即使有多个列,最高效的方法可能仍然是使用子查询:

    select created_date, ssn, d.*
    from (select u.created_date, u.ssn,
                 (select d.id
                  from lead_data d
                  where d.ssn = u.ssn
                  order by d.id desc
                  limit 1
                 ) as id
          from (select u.*
                from lead_unique u
                order by u.created_date desc
                limit 2
               ) u
         ) u join
         lead_data d
         on u.id = d.id;
    

    顺便说一句,如果性能是一个问题,您需要以下索引:lead_unique(created_date)lead_data(id)。这两个索引应该很快。

    【讨论】:

    • lead_data 表保持简单,所以我只添加了一列额外的数据(名称),但实际上表中有更多数据列,因此查询需要能够处理无限更多列.. 输出可能是“created_date, ssn, name, address, city, state, zip....etc..”。
    • 嘿那里.. 我得到了最后一个查询来满足我的需要.. 非常感谢你!我确实在这些字段上有索引,查询也非常快。实际的表非常大。800 万在一个和近 3 亿在领先数据表中。太棒了!现在要弄清楚如何接受这个答案..
    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多