Question

Je table avec 3 colonnes: id (de la personne), la ville (qui a visité personne) et la date (de sa visite). Je dois sélectionner toutes les personnes (leurs) ids qui étaient dans la ville de Los Angeles entre la date spécifique, qui étaient également dans la ville de New York à une autre date spécifique.

Voici un exemple de la requête que je lance maintenant:

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);

Tout ce que je peux aussi? Est-il y a une autre question que je peux utiliser? Cette sélection est trop lent.

Était-ce utile?

La solution

En utilisant une jointure (avec un alias) au lieu d'une sous-requête doit effectuer mieux:

  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;

Autres conseils

D'abord, vous devez vous assurer que vous avez les indices pertinents en place. Dans ce cas, il est probablement l'un index avec deux colonnes date et la ville. Après cela, vous pouvez prendre votre requête et comparer les performances des requêtes proposées ici. jointure interne pourrait être plus rapide que ce que vous avez déjà.

Ma version fonctionne dans SQL Server. Je pourrais travailler dans d'autres SGBD ainsi.

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'

Essayez le jointure interne

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 

Vérifiez les index sur la table et voir si vous avez une ville et sur la date.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top