2017-06-02 125 views
0

我有一個查詢來計算一所大學(按流派劃分)有多少學生吃食物類別(例如蔬菜,肉類,魚類......)。優化查詢SQL

我的數據庫中的每種菜餚都有一個id dish_composition。我寫查詢,但計算所有類別使用711秒(12分鐘)。這是非常低效的。你能幫我減少執行時間嗎?

這是查詢:

<?php  
$query=(SELECT SUM(uomini) as uomini_carne, SUM(donne) as donne_carne FROM (SELECT SUM(case when person.sex='M' then 1 end) as uomini, SUM(case when person.sex='F' then 1 end) as donne FROM `dish` JOIN dish_bought ON dish.id_dish=dish_bought.id_dish JOIN meal_receipt ON dish_bought.id_receipt=meal_receipt.id_receipt JOIN relation ON meal_receipt.id_stu=relation.id_stu JOIN person ON relation.id_pers=person.id_pers WHERE dish.dish_composition BETWEEN 51 AND 54 GROUP BY dish.dish_composition) carne) 
    UNION ALL 
    (SELECT SUM(uomini) as uomini_carne, SUM(donne) as donne_carne FROM (SELECT SUM(case when person.sex='M' then 1 end) as uomini, SUM(case when person.sex='F' then 1 end) as donne FROM `dish` JOIN dish_bought ON dish.id_dish=dish_bought.id_dish JOIN meal_receipt ON dish_bought.id_receipt=meal_receipt.id_receipt JOIN relation ON meal_receipt.id_stu=relation.id_stu JOIN person ON relation.id_pers=person.id_pers WHERE dish.dish_composition BETWEEN 10 AND 34 GROUP BY dish.dish_composition) primo) 
    UNION ALL 
    (SELECT SUM(uomini) as uomini_carne, SUM(donne) as donne_carne FROM (SELECT SUM(case when person.sex='M' then 1 end) as uomini, SUM(case when person.sex='F' then 1 end) as donne FROM `dish` JOIN dish_bought ON dish.id_dish=dish_bought.id_dish JOIN meal_receipt ON dish_bought.id_receipt=meal_receipt.id_receipt JOIN relation ON meal_receipt.id_stu=relation.id_stu JOIN person ON relation.id_pers=person.id_pers WHERE dish.dish_composition BETWEEN 60 AND 62 GROUP BY dish.dish_composition) pesce) 
    UNION ALL 
    (SELECT SUM(uomini) as uomini_carne, SUM(donne) as donne_carne FROM (SELECT SUM(case when person.sex='M' then 1 end) as uomini, SUM(case when person.sex='F' then 1 end) as donne FROM `dish` JOIN dish_bought ON dish.id_dish=dish_bought.id_dish JOIN meal_receipt ON dish_bought.id_receipt=meal_receipt.id_receipt JOIN relation ON meal_receipt.id_stu=relation.id_stu JOIN person ON relation.id_pers=person.id_pers WHERE dish.dish_composition IN (71,72,81,82,93) GROUP BY dish.dish_composition) verdura) 
    UNION ALL 
    (SELECT SUM(uomini) as uomini_carne, SUM(donne) as donne_carne FROM (SELECT SUM(case when person.sex='M' then 1 end) as uomini, SUM(case when person.sex='F' then 1 end) as donne FROM `dish` JOIN dish_bought ON dish.id_dish=dish_bought.id_dish JOIN meal_receipt ON dish_bought.id_receipt=meal_receipt.id_receipt JOIN relation ON meal_receipt.id_stu=relation.id_stu JOIN person ON relation.id_pers=person.id_pers WHERE dish.dish_composition BETWEEN 91 AND 92 GROUP BY dish.dish_composition) uova) 
    UNION ALL 
    (SELECT SUM(uomini) as uomini_carne, SUM(donne) as donne_carne FROM (SELECT SUM(case when person.sex='M' then 1 end) as uomini, SUM(case when person.sex='F' then 1 end) as donne FROM `dish` JOIN dish_bought ON dish.id_dish=dish_bought.id_dish JOIN meal_receipt ON dish_bought.id_receipt=meal_receipt.id_receipt JOIN relation ON meal_receipt.id_stu=relation.id_stu JOIN person ON relation.id_pers=person.id_pers WHERE dish.dish_composition IN (101,101,212) GROUP BY dish.dish_composition) formaggi) 
    UNION ALL 
    (SELECT SUM(uomini) as uomini_carne, SUM(donne) as donne_carne FROM (SELECT SUM(case when person.sex='M' then 1 end) as uomini, SUM(case when person.sex='F' then 1 end) as donne FROM `dish` JOIN dish_bought ON dish.id_dish=dish_bought.id_dish JOIN meal_receipt ON dish_bought.id_receipt=meal_receipt.id_receipt JOIN relation ON meal_receipt.id_stu=relation.id_stu JOIN person ON relation.id_pers=person.id_pers WHERE dish.dish_composition=83 GROUP BY dish.dish_composition) legumi) 
    UNION ALL 
    (SELECT SUM(uomini) as uomini_carne, SUM(donne) as donne_carne FROM (SELECT SUM(case when person.sex='M' then 1 end) as uomini, SUM(case when person.sex='F' then 1 end) as donne FROM `dish` JOIN dish_bought ON dish.id_dish=dish_bought.id_dish JOIN meal_receipt ON dish_bought.id_receipt=meal_receipt.id_receipt JOIN relation ON meal_receipt.id_stu=relation.id_stu JOIN person ON relation.id_pers=person.id_pers WHERE dish.dish_composition=415 GROUP BY dish.dish_composition) frutta)"; 
?> 
+1

用例語句 – maSTAShuFu

+0

我可以在哪裏使用case語句? – kyle1009

+0

使用案例語句分類您的碟形...使用此查詢作爲派生表來總結您的卡路里組的碟... – maSTAShuFu

回答

0

應該是類似這樣的東西......你必須完成case語句......

如果您不能使用IIF然後用案例

取代

1)變換原始數據
2)總結原始數據

SELECT 
    SUM(iif(x.gender = 'F',1,0)) AS Female, 
    SUM(iif(x.gender = 'M',1,0)) AS Male, 
    x.DishName 
FROM 
(SELECT 
    person.sex as gender, 
    case 
     when dish.dish_composition BETWEEN 51 AND 54 then 'carne' 
     when .... then 'dish 2' 
     when .... then 'dish 3' 
     else 'dish 100' 
    end as DishName 
FROM dish 
JOIN dish_bought 
    ON dish.id_dish = dish_bought.id_dish 
JOIN meal_receipt 
    ON dish_bought.id_receipt = meal_receipt.id_receipt 
JOIN relation 
    ON meal_receipt.id_stu = relation.id_stu 
JOIN person 
    ON relation.id_pers = person.id_pers 
) x 

group by x.gender, x.DishName