【问题标题】:MySQL LEFT JOIN only one row, ordered by column without subqueryMySQL LEFT JOIN 仅一行,按列排序,无子查询
【发布时间】:2015-01-16 22:25:48
【问题描述】:

是否有可能在不使用子查询的情况下仅使用按列(日期)排序的其他表中的一行进行 LEFT JOIN。我的查询如下。它可以工作,但速度非常慢。

SELECT * FROM clients c 
LEFT JOIN loan l ON c.id = l.id_client AND l.id = (
    SELECT id FROM loan ll
    WHERE ll.id_client = c.id
    ORDER BY `create_date` DESC
    LIMIT 1) 
GROUP BY k.id DESC 
ORDER BY c.register_date DESC 
LIMIT n , m; (n,m is from pagination)

有没有办法加快速度?

【问题讨论】:

  • 使用连接代替AND l.id=subquery。 EXPLAIN 计划和表定义的结果也会有所帮助。
  • 你的数据是什么样的?
  • 好的,但是我怎样才能限制1条记录只有一个加入?稍后我将粘贴我的表 def,因为现在我无权访问。目前:客户有很多贷款,那么如何只加入一行?

标签: mysql sql subquery left-join


【解决方案1】:

我将您的问题解释为“向我获取每个客户最近贷款的所有贷款详细信息”

这应该可行……但请注意假设。

SELECT * 
FROM 
    clients c 
    LEFT JOIN (select id_client, Max(id) id -- this assumes that a loan with a later create date will also have a higher id.
                from loan
                group by id_client) il
        on il.id_client = c.id
    inner join loan l
        on l.id = il.id
GROUP BY k.id DESC                          -- Dont know what "k" is
ORDER BY c.register_date DESC 
LIMIT n , m; (n,m is from pagination)

【讨论】:

  • 太棒了!它工作得很好,但我仍然不知道为什么你的查询比我的要快。你能解释一下吗?
  • 你的意思是:获取所有客户的所有贷款,现在单独获取每个客户的所有贷款,按日期对贷款进行排序,然后取第一个,现在过滤第一个结果集那个贷款ID。 .....我的意思是获取每个客户的最新贷款ID以及该贷款的所有详细信息。它更快的一个原因是因为我更早地限制了结果集,因此查询不必处理我们将要丢弃的一大堆记录。
  • 不是很优雅,但速度更快,我必须记住这个技巧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2012-09-05
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多