3 Stimmen

Hilfe bei der Optimierung von SQL-Abfragen

Hallo, ich brauche Hilfe bei diesem Problem. Ich arbeite Web-Anwendung und für die Datenbank bin ich mit Sqlite. Kann mir jemand mit einer Abfrage aus der Datenbank helfen, die optimiert werden muss == schnell =)

Ich habe Tisch 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 ist die ID der verschiedenen Gerichte, ID_INGREDIENT ist die Zutat, aus der das Gericht besteht: In meinem Fall wird das Gericht mit der ID 1 aus den Zutaten mit den IDs 2 und 3 hergestellt.

In dieser Tabelle habe ich mehr als 15000 Zeilen und meine Frage ist:

Ich benötige eine Abfrage, die Zeilen abruft, in denen ich IDs von Gerichten finden kann, die nach der Anzahl der Inhaltsstoffe ASC geordnet sind, die ich meinem Algorithmus hinzugefügt habe.

Beispiel: foo(2,4) ergibt Zeilen in dieser Reihenfolge:

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

Gericht mit id 10 hat Zutaten mit id 2 und 4 und hat keine 2 weiteren, dann ist

Meine Frage ist:

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

funktioniert, aber es ist langsam....

2voto

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

dies ist die Lösung, meine vorherige Abfrage arbeiten 5 - 20s diese Arbeit über 80ms

1voto

Apalala Punkte 8628

Dies ist aus dem Gedächtnis, da ich den SQL-Dialekt von sqlite nicht kenne.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X