Frage

Ich habe Tabelle mit 3 Spalten: ID (von Person), Stadt (welche Person besucht) und Datum (seines Besuchs). Ich muss alle Personen (ihre IDs) auswählen, die sich zwischen spezifischem Datum in der Stadt Los Angeles befanden und zu einem anderen bestimmten Datum in City New York waren.

Hier ist ein Beispiel für die Abfrage, die ich jetzt betreibe:

SELECT DISTINCT id 
FROM places 
WHERE date >= '2011-03-18' AND 
      date < '2011-03-19' AND 
      city = 'los angeles' AND 
      id IN (SELECT DISTINCT id 
             FROM places 
             WHERE date >= '2011-03-15' AND 
                   date < '2011-03-16' AND 
                   city = 'chicago' 
             GROUP BY id);

Was kann ich auch? Gibt es eine andere Abfrage, die ich verwenden kann? Diese Auswahl ist viel zu langsam.

War es hilfreich?

Lösung

Die Verwendung eines Join (mit einem Alias) anstelle einer Unterabfrage sollte besser abschneiden:

  SELECT places.id 
    FROM places 
         JOIN places AS places2 ON places2.id = places.id
     AND places2.date >= '2011-03-15' 
     AND places2.date < '2011-03-16' 
     AND places2.city = 'chicago' 
   WHERE places.date >= '2011-03-18' 
     AND places.date < '2011-03-19' 
     AND places.city = 'los angeles' 
GROUP BY places.id;

Andere Tipps

Zuerst müssen Sie sicherstellen, dass Sie über die entsprechenden Indizes verfügen. In diesem Fall handelt es sich wahrscheinlich um einen Index mit zwei Spalten Datum und Stadt. Danach können Sie Ihre Anfrage nehmen und die Leistung mit den hier vorgeschlagenen Fragen vergleichen. Innerer Join könnte schneller sein als das, was Sie bereits haben.

Meine Version funktioniert in SQL Server. Ich könnte auch in anderen DBMs arbeiten.

select id 
from places 
where [date] >= '2011-03-18' AND 
      [date] < '2011-03-19' AND 
      city = 'los angeles'
intersect       
select id 
from places 
where [date] >= '2011-03-15' AND 
      [date] < '2011-03-16' AND 
      city = 'chicago';
SELECT id
FROM places AS p1
INNER JOIN AS p2 ON p1.id = p2.id AND p2.date >= '2011-03-15' AND p2.date < '2011-03-19'
   AND p2.city = 'chicago'
WHERE p1.date >= '2011-03-18' AND p1.date < '2011-03-19' AND p1.city = 'los angelis'

Probieren Sie den inneren Join aus

SELECT DISTINCT p1.id 
FROM places p1
INNER JOIN places p2 ON p1.id = p2.id AND
      p2.date >= '2011-03-18' AND 
      p2.date < '2011-03-19' AND 
      p2.city = 'los angeles'
WHERE p1.date >= '2011-03-18' AND 
      p1.date < '2011-03-19' AND 
      p1.city = 'los angeles' AND 

Überprüfen Sie die Indizes in der Tabelle und prüfen Sie, ob Sie in der Stadt und des Datums welche haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top