MySql:从表A中找到未在表B或C中指出的行

时间:2014-06-20 19:49:57

标签: mysql sql join

我需要一套约5k食谱和

  1. 删除已归类的
  2. 删除已批量处理的
  3. 这应该留给我一份分类的,未经分类的食谱清单。

    我发现很难从初始集中减去记录,特别是当每个集合大约为10k时。我一直试图使用的查询要么是缓慢的,要么是返回结果,我不自信。我只是想对数字做一些答案,所以查询不一定特别快 - 合理的做法。这些是我正在使用的表格:

    表格食谱:这些是我们正在操作的食谱。 ids是独一无二的。

    mysql> select id, title from recipes limit 10;
    +---------+---------------------------------------------+
    | id      | title                                       | 
    +---------+---------------------------------------------+
    | R162739 | Chipotle Steak                              |
    | R223652 | Sweet Pea Mash on Toast                     |
    | R216897 | Horchata Latte                              |
    | R125550 | Roasted Beet and Fennel Salad               |
    | R196267 | Sweet Potatoes with Fruit                   |
    | R215630 | Mini Oatmeal-Raisin Cookies                 |
    | R219133 | Pork with Butternut Squash                  |
    | R166935 | Herb-Ginger Bulgur                          |
    | R208872 | Chocolate-Macadamia Dreams                  |
    | R220442 | Smoked Turkey Salad                         |
    +---------+---------------------------------------------+
    

    表recipe_log :每当有人向某个类别添加配方时,会在日志表中生成一个注释。日志表有大约14k条记录 - 其中许多不是我感兴趣的类型.Ids不是唯一的 - 相同的食谱ID可能有很多记录。

     mysql> select * from recipe_log where type='category changes' limit 10;
    +---------+---------------------+------------------+------+
    | id      | date                | type             | note |
    +---------+---------------------+------------------+------+
    | R216064 | 2014-05-23 19:05:47 | category changes | NULL |
    | R216064 | 2014-05-23 19:06:11 | category changes | NULL |
    | R178159 | 2014-05-23 21:55:08 | category changes | NULL |
    | R178159 | 2014-05-24 02:13:34 | category changes | NULL |
    | R178159 | 2014-05-24 21:49:20 | category changes | NULL |
    | r178159 | 2014-05-24 21:52:52 | category changes | NULL |
    | r178613 | 2014-05-24 21:58:07 | category changes | NULL |
    | r178613 | 2014-05-24 21:59:24 | category changes | NULL |
    | r178159 | 2014-05-24 22:00:11 | category changes | NULL |
    | r178613 | 2014-05-24 22:00:51 | category changes | NULL |
    +---------+---------------------+------------------+------+
    

    表recipe_batches :此表包含已添加到批处理中的配方。 Ids不是唯一的 - 可以将相同的配方添加到多个批次中。这张表中有大约10条记录。

    mysql> select recipe_id, batch_id, date from recipe_batches limit 10;
    +-----------+----------+---------------------+
    | recipe_id | batch_id | date                |
    +-----------+----------+---------------------+
    | R109651   | EH_1_250 | 2014-06-04 01:01:01 |
    | R111068   | EH_1_250 | 2014-06-04 01:01:01 |
    | R113500   | EH_1_250 | 2014-06-04 01:01:01 |
    | R117349   | EH_1_250 | 2014-06-04 01:01:01 |
    | R117494   | EH_1_250 | 2014-06-04 01:01:01 |
    | R109648   | EH_1_250 | 2014-06-04 01:01:01 |
    | R109652   | EH_1_250 | 2014-06-04 01:01:01 |
    | R110440   | EH_1_250 | 2014-06-04 01:01:01 |
    | R113004   | EH_1_250 | 2014-06-04 01:01:01 |
    | R111068   | EH_1_250 | 2014-06-04 01:01:01 |
    +-----------+----------+---------------------+
    

1 个答案:

答案 0 :(得分:0)

您可以先获取recipe_id的列表,首先获取已分类的列表,因为您要保留它们并删除已经批处理的列表。除非我理解错误,否则每个已经分类的配方都应该被退回,除非它也是批次的。

select distinct a.recipe_id 
from recipe_log a 
where a.type='category changes'
and not exists (select * from recipe_batches b where a.recipe_id = b.recipe_id)