首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询优化

查询优化
EN

Stack Overflow用户
提问于 2011-12-06 01:47:23
回答 2查看 173关注 0票数 0

我对这个缓慢的查询有一个问题:

代码语言:javascript
复制
SELECT c.*, csc1.changed_status
  FROM contract c
  LEFT
  JOIN contract_status_change csc1
    ON csc1.contract_status_change_id =
        ( SELECT csc2.contract_status_change_id
            FROM contract_status_change csc2
           WHERE csc2.contract_id = c.contract_id
           ORDER
              BY csc2.date_changed DESC
           LIMIT 1
        )
 ;

我有一个contract表和一个contract_status_change表,这两个表记录了合同的状态。此查询将连接合同的最新状态,以便您可以获得其当前状态。

你能帮我整理一下吗?

-编辑-

我很抱歉。我已经更新了查询,包括选择实际的最新状态。很抱歉给您带来了混乱!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-06 02:09:43

对查询进行可读性格式化(一致的空格和大小写,删除不必要的反引号和括号,更合理的别名)后:

代码语言:javascript
复制
SELECT c.*
  FROM contract c
  LEFT
  JOIN contract_status_change csc1
    ON csc1.contract_status_change_id =
        ( SELECT csc2.contract_status_change_id
            FROM contract_status_change csc2
           WHERE csc2.contract_id = c.contract_id
           ORDER
              BY csc2.date_changed DESC
           LIMIT 1
        )
 ;

假设contract_status_change.contract_status_change_id是一个惟一的标识符,我不得不得出结论,您的查询等同于这个,效率更高:

代码语言:javascript
复制
SELECT c.*
  FROM contract c
 ;

您说它“正在将最新状态加入到合同中,这样您就可以获得它的当前状态”,但是它不会对当前状态做任何事情--不会按当前状态排序,不会根据它进行过滤,也不会将其包含在查询结果中--所以没有必要这么做。

票数 1
EN

Stack Overflow用户

发布于 2011-12-06 05:43:11

代码语言:javascript
复制
This should help a bit.

SELECT c.*, csc1.changed_status
FROM contract c LEFT JOIN contract_changed_status csc1 ON c.contract_id = csc1.contract_id
INNER JOIN 
   (
    SELECT contract_id, changed_status, MAX(date_changed) AS 'max_date' 
    FROM contract_status_changed GROUP_BY contract_id
    GROUP BY contract_id
   ) csc2 ON csc1.contract_id = csc2.contract_id AND csc1.date_changed = csc2.max_date   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8389559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档