1

id(人の)、city(人が訪問した)、date(彼の訪問の)の3つの列を持つテーブルがあります。特定の日付の間にロサンゼルス市にいて、他の特定の日にニューヨーク市にもいたすべての人(ID)を選択する必要があります。

これが私が今実行しているクエリの例です:

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

私もできることはありますか?他に使用できるクエリはありますか?この選択は遅すぎます。

4

4 に答える 4

9

サブクエリの代わりに結合 (エイリアスを使用) を使用すると、パフォーマンスが向上するはずです。

  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;
于 2011-03-19T05:57:34.047 に答える
1

まず、関連するインデックスが配置されていることを確認する必要があります。この場合、おそらく日付と都市の 2 つの列を持つ 1 つのインデックスです。その後、クエリを取得して、ここで提案されているクエリとパフォーマンスを比較できます。内部結合は、既に取得したものよりも高速である可能性があります。

私のバージョンは SQL Server で動作します。他の DBMS でも作業する可能性があります。

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';
于 2011-03-19T06:18:59.167 に答える
1
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'
于 2011-03-19T06:00:02.343 に答える
1

内部結合を試す

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 

テーブルのインデックスをチェックして、都市と日付に関するインデックスがあるかどうかを確認します。

于 2011-03-19T06:04:36.700 に答える