2011-01-06 154 views
3

嗨,我需要一些幫助解決這個問題。 我正在使用web應用程序和數據庫我使用sqlite。有人可以幫助我從一個DATABSE查詢必須優化==快速=)幫助優化SQL查詢

我有表X:

ID | ID_DISH | ID_INGREDIENT 
1 | 1  | 2 
2 | 1  | 3 
3 | 1  | 8 
4 | 1  | 12 

5 | 2  | 13 
6 | 2  | 5 
7 | 2  | 3 

8 | 3  | 5 
9 | 3  | 8 
10| 3  | 2 

.... ID_DISH是不同的菜餚ID,ID_INGREDIENT是其中的成分所以在我的情況菜 ID爲1與IDS 2,3

在這個表中有更多然後15000行食材製成的,我的問題是::這道菜由

我需要查詢這將取在這裏我可以找到由我不知道添加到我的算法中的ingreedients ASC計數的菜餚ID。

examle:FOO(2,4) 將按此順序行:

ID_DISH | count(stillMissing) 
    10 | 2 
    1 | 3  

碟ID 10具有id爲2和4成分和還沒有得到2個,然後是

我的查詢是:

SELECT 
    t2.ID_dish, 
    (SELECT COUNT(*) as c FROM dishIngredient as t1 
    WHERE t1.ID_ingredient NOT IN (2,4) 
    AND t1.ID_dish = t2.ID_dish 
    GROUP BY ID_dish) as c 
FROM dishIngredient as t2 
WHERE t2.ID_ingredient IN (2,4) 
GROUP BY t2.ID_dish 
ORDER BY c ASC 

的作品,但它是緩慢....

+10

+1發明了 'optimazing'。哪個國際海事組織應該表示「執行驚人的優化」。 – karim79 2011-01-06 20:50:38

+1

你在該表上添加了什麼索引? – zsong 2011-01-06 21:17:01

回答

2
select ID_DISH, sum(ID_INGREDIENT not in (2, 4)) stillMissing 
from x 
group by ID_DISH 
having stillMissing != count(*) 
order by stillMissing 

這是解決方案,我以前的查詢工作5 - 20年代這項工作80ms左右

1

這是從MEM ory,因爲我不知道sqlite的SQL方言。

SELECT DISTINCT T1.ID_DISH, COUNT(T1.ID_INGREDIENT) as COUNT 
FROM dishIngredient as T1 LEFT JOIN dishIngredient as T2 
ON T1.ID_DISH = T2.ID_DISH 
WHERE T2.ID_INGREDIENT IN (2,4) 
GROUP BY T1.ID_DISH 
ORDER BY T1.ID_DISH