2015-03-31 17 views
-2

我有一個大的查詢是加入3個表,並有兩個子查詢我想優化它。我正在考慮抽取子查詢來隔離查詢,但爲此我必須使用額外的for循環,並且必須在內部運行查詢for循環n次。有沒有更好的方法來查找數據?想優化我的解決方案。請給我提供很好的解決方案/建議優化mysql查詢使用兩個子查詢,並有3個表的左連接需要更好的解決方案

以下是我的查詢。

SELECT `e`.`id` 
    ,(SELECT sum(sl.amount) 
     FROM `sales` AS `sl` 
     LEFT JOIN `trans` AS `t` ON t.id = sl.transId 
     WHERE (sl.entity_id = e.id) 
      AND (DATE_FORMAT(t.accounting_date, '%Y-%m')) = '2015-02') AS `2015-02` 
    ,(SELECT sum(sl.amount) 
     FROM `sales` AS `sl` 
     LEFT JOIN `trans` AS `t` ON t.id = sl.transId 
     WHERE (sl.entity_id = e.id) 
      AND (DATE_FORMAT(t.accounting_date, '%Y-%m'))) AS `2015-01` 
    ,`e`.`forenames` 
    , `e`.`surname` 
    , `e`.`company_name` 
    , `e`.`address1` 
    ,`e`.`address2` 
    , `e`.`phone1` 
    ,`e`.`postcode` 
    , eassoc.associated_entity_id IS NULL AS `is_parent` 
    ,`ent`.`accountPersonManager` 
FROM `entity` AS `e` 
LEFT JOIN `entity_link` AS `eassoc` ON eassoc.linkentity_id = e.id 
LEFT JOIN `entities` AS `ent` ON ent.entity_id = e.id 
WHERE (e.archived = 0 
    OR e.archived IS NULL) 
GROUP BY `e`.`id` 
ORDER BY `2015-02` DESC LIMIT 75 
+1

而你的問題是? – 2015-03-31 14:18:36

+0

我想找到連擊方式來獲得結果數據 – 2015-03-31 14:42:42

+0

這是一個陳述,而不是一個問題。定義「更好」。 – 2015-03-31 14:53:34

回答

1

使用不同的查詢和循環不是優化您想要實現的工作的解決方案。 根據您提供給我們的少數信息,我建議您避免使用子查詢並使用聯合(對於數據集的每行都執行子查詢,然後對結果進行分組)。

嘗試此查詢:

SELECT `e`.`id` 
    ,MAX(CASE 
      WHEN slbymonth = '2015-02' THEN slbymonth.total 
      ELSE 0 
     END) AS `2015-02` 
    ,MAX(CASE 
      WHEN slbymonth = '2015-01' THEN slbymonth.total 
      ELSE 0 
     END) AS `2015-01` 
    ,`e`.`forenames` 
    , `e`.`surname` 
    , `e`.`company_name` 
    , `e`.`address1` 
    ,`e`.`address2` 
    , `e`.`phone1` 
    ,`e`.`postcode` 
    , eassoc.associated_entity_id IS NULL AS `is_parent` 
    ,`ent`.`accountPersonManager` 
FROM `entity` AS `e` 
LEFT JOIN (SELECT sl.entity_id 
       ,DATE_FORMAT(t.accounting_date, '%Y-%m') AS `month` 
       ,SUM(sl.amount) AS `total` 
      FROM `sales` AS `sl` 
      INNER JOIN `trans` AS `t` ON T.id = sl.transId 
      GROUP BY sl.entity_id, DATE_FORMAT(t.accounting_date, '%Y-%m')) AS `slbymonth` ON slbymonth.entity_id = e.id 
                           AND slbymonth.month IN ('2015-01', '2015-02') 
LEFT JOIN `entity_link` AS `eassoc` ON eassoc.linkentity_id = e.id 
LEFT JOIN `entities` AS `ent` ON ent.entity_id = e.id 
WHERE IFNULL(e.archived, 0) = 0 
GROUP BY `e`.`id`, `e`.`forenames`, ... 
ORDER BY `2015-02` DESC LIMIT 75 

因爲我們不知道你的表結構信息,所提出的查詢是基於我的解釋。

我刪除了這兩個子查詢,並在一個自定義查詢上使用了一個新的關聯,這個關聯是每個實體每月銷售額的集合。爲了優化聯合,我添加了一個條件,以便僅保留月份'2015-01''2015-02'

希望這會幫助你,不要猶豫,向我們提供更多的信息,以獲得更好的建議。