Помогите с оптимизацией SQL-запроса - PullRequest
3 голосов
/ 06 января 2011

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

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

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

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

examle: foo (2,4) будет выводить строки в следующем порядке:

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

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

работает,но это медленно ....

Ответы [ 2 ]

2 голосов
/ 07 января 2011
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 с, это работает около 80 мс

1 голос
/ 07 января 2011

Это из памяти, так как я не знаю 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...