2011-01-06 3 views
3

Привет, мне нужна помощь с этой проблемой. Я работаю в веб-приложении, и для базы данных я использую sqlite. Может кто-нибудь помочь мне с одним запросом из Databse, которые должны быть оптимизированы == быстро =)Помогите с оптимизацией SQL-запроса

У меня есть таблица х:

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_INGREDIENT является ингредиентом, который блюдо состоит из: так в моем случае блюдо с идентификатором 1 производится с ингредиентами с идентификаторами 2,3

в этой таблице а имеют более 15000 строк, и мой вопрос:

я нужен запрос, который будет получать ряды, где я могу найти ids блюд, заказанных по счету разлагающихся ASC, которые я добавил в свой алгоритм.

нелогич-: Foo (2,4) будет строки в следующем порядке:

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

Блюдо с ID 10 имеет компоненты с идентификатором 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

+1

Какой индекс вы добавили на эту таблицу? – zsong

ответ

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

Это из мем ory, поскольку я не знаю SQL-диалекта sqlite.

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 
+0

эта работа, но я уже получил более быстрый запрос, спасибо – Gasper

Смежные вопросы