2016-06-18 24 views
0

Ich bin neu in der Programmierung und dieses Forum so mit mir. Ich führe diese Abfrage auf meiner Website aus, um anhand bestimmter Kriterien eine ToDo-Liste zu finden. Aber es läuft zu langsam und es ist wahrscheinlich möglich, es auf eine andere Weise zu schreiben.Wie kann ich diese Abfrage schneller ausführen

SELECT * FROM lesson WHERE 
id IN 
(SELECT `lesson_id` FROM `localization_logging` 
WHERE `language_id` = 2 AND `action_id` = 1) 
AND `id` NOT IN 
(SELECT `lesson_id` FROM `localization_logging` 
WHERE `language_id` = 2 AND `part_id` = 1 AND `action_id` = 6) 

Was die Abfrage tut, ist, dass es in der Stundentafel sieht alles Lektion Listennamen zu finden und dann überprüft, ob eine bestimmte Aufgabe erledigt ist. Wenn die Aufgabe in einer Aufgabe erledigt ist, dann zeige sie in der nächsten. Aktion 1 ist getan, aber nicht Aktion 6 in diesem Fall.

Ich hoffe, ich erkläre das gut genug. Auf meinem lokalen Rechner dauert die Abfrage 1,8 Sekunden, und manchmal muss ich mehrere Listen nebeneinander drucken, und dann dauert das 1,8-fache der Listen, wodurch die Seite extrem langsam wird.

Danke für die Hilfe, die ich bekommen kann!

+0

Zuerst ist zu sehen, was die Datenbank ausführen: EXPLAIN yourQuery; und posten Sie das Ergebnis, dann können wir sehen, was passiert ist –

Antwort

0

So etwas wie dies für mark-ID als beendet:

SELECT l.*, SUM(ll.action_id=6) completed FROM lesson l 
INNER JOIN localization_logging ll ON ll.lesson_id = l.id 
WHERE ll.language_id = 2 AND 
(
ll.action_id = 1 
    OR 
ll.action_id = 6 AND ll.part_id == 1 
) 
GROUP BY l.id 

Und jetzt können wir es wickeln mit:

SELECT t.* FROM (...) t WHERE t.completed = 0 
0

Sie werden in der Regel schneller Abfragen mit INNER/LEFT JOIN Filterung Reihen, aber Sie brauchen um es zu testen.

SELECT lesson.* FROM lesson 
INNER JOIN localization_logging task1 
    ON lesson.id = task1.lesson_id 
LEFT JOIN localization_logging task2 
    ON lesson.id = task2.lesson_id 
    AND task2.language_id = 2 
    AND task2.part_id = 1 
    AND task2.action_id = 6 
WHERE task1.language_id = 2 
AND task1.action_id = 1 
AND task2.lesson_id IS NULL 

zweite Tabelle auf mehreren Bedingungen verbunden ist, aber haben sie innerhalb ON Klausel zur Liste, weil nur Ergebnisse, die in Folge waren als nulls „Kraft trat“ (LEFT JOIN Mittel linke Seite bleibt, egal was) erforderlich sind.

Btw. Sie erhalten mehrere Zeilen von lesson, wenn die Bedingung die Ergebnisse nicht auf eine Zeile beschränkt - GROUP BY lesson.id dann.

Verwandte Themen