SQL查询选择整个表,除了'ignore_table'中定义的记录

时间:2014-01-03 07:58:34

标签: mysql sql performance

我正在使用Mysql存储一些记录(不会超过150,200)。 Sql服务器在处理查询时非常快速和优化,但我的问题是连接速度慢且延迟高,我不想执行比绝对需要更多的查询。我的表格如下:

some_table:
ID  Name    Start   Duration
-----------------------------
1   rec1    0       15
2   rec2    0       25
3   arc3    15      15
4   rac4    30      30

ignore_table:
ID  rec_id  day
----------------
1   2       0
2   3       1
3   3       2

我想从some_table中选择所有记录,除了那些在给定日期应该被忽略的记录(这实际上是整个查询中唯一不同的记录)。

假设当前日期为1,那么我想执行一些将返回的查询:

ID  Name    Start   Duration
-----------------------------
1   rec1    0       15
2   rec2    0       25
4   rac4    30      30

由于ignore_table中的第2条记录,删除了ID为3的记录 - 它表示在第一天我们应该忽略ID等于3的记录。

我曾经从some_table中选择所有记录,然后分别检查每一条记录,看它们是否应该被忽略。这适用于localhost上的大量数据,但在真实的应用程序中,我真的更喜欢更快的东西。

提前致谢:)

2 个答案:

答案 0 :(得分:2)

您需要以下内容:

SELECT s.* FROM some_table s
  LEFT JOIN ignore_table i ON s.ID = i.rec_id AND i.day = 1
  WHERE i.ID IS NULL;

或者:

SELECT s.* FROM some_table s
  WHERE s.ID NOT IN (
    SELECT i.rec_id FROM ignore_table i WHERE i.day = 1
  );

答案 1 :(得分:1)

使用subselect:

SELECT * 
FROM   some_table 
WHERE  id NOT IN (SELECT rec_id 
                  FROM   ignore_table 
                  WHERE  day = 2)