5

我有一张包含大约 5000 万条记录的表。

表结构如下所示,并且calleridcall_start字段都被索引。

id -- callerid -- call_start

我想选择其 call_start 大于 '2013-12-22' 并且 callerid 在整个表中的 '2013-12-22' 之前不重复的所有记录。

我用过这样的东西:

SELECT DISTINCT 
  ca.`callerid` 
FROM
  call_archives AS ca 
WHERE ca.`call_start` >= '2013-12-22' 
  AND ca.`callerid` NOT IN 
  (SELECT DISTINCT 
    ca.`callerid` 
  FROM
    call_archives AS ca 
  WHERE ca.`call_start` < '2013-12-21')

但这非常慢,任何建议都非常感谢。

4

3 回答 3

3

尝试NOT EXISTS

SELECT DISTINCT 
  ca.`callerid` 
FROM
  call_archives AS ca 
WHERE ca.`call_start` >= '2013-12-22' 
  AND NOT EXISTS 
  (SELECT 
    1 
  FROM
    call_archives AS cb 
  WHERE ca.`callerid` = cb.`callerid` 
    AND cb.`call_start` < '2013-12-21')
于 2013-12-26T13:17:11.880 回答
2

只是好奇这个查询是否在您的桌子上运行得很快:

SELECT ca.`callerid` 
FROM call_archives 
GROUP BY ca.`callerid` 
HAVING MIN(ca.`call_start`) >='2013-12-22' 
于 2013-12-26T13:42:07.160 回答
0

使用NOT EXISTS代替NOT IN

试试这个:

SELECT DISTINCT ca.callerid 
FROM call_archives AS ca 
WHERE ca.call_start>='2013-12-22' AND 
  NOT EXISTS(SELECT 1 FROM call_archives AS ca1 
             WHERE ca.callerid = ca1.callerid AND ca1.call_start <'2013-12-21');
于 2013-12-26T13:17:08.897 回答