2014-06-20 2 views
0

내가 MySQL은 : 표 A에서 행이 테이블 B에 표시되지 않거나 C

  • 이 사람을 제거 분류되지 않은 그 사람을 제거하려면 ~ 5K 조리법의 세트

    1. 를 취할 필요가 찾아

  • 을 일괄 처리되었는지이 분류, unbatched 조리법의 목록이 날 떠나해야한다.

    특히 각 세트가 약 10k 인 경우 초기 세트에서 레코드를 빼기가 어렵습니다. 내가 사용하려고 시도한 쿼리는 속도가 느리거나 결과를 반환하는 것이 확실하지 않습니다. 숫자에 대한 답변을 얻으려고하기 때문에 쿼리가 특히 빠를 필요가 없습니다. . 다음 표는 내가 사용하고있는 테이블입니다 :

    테이블 요리법 : 이들은 우리가 조작하고있는 요리법입니다. ID는 고유합니다.

    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 개의 레코드가 있습니다. 그 중 많은 유형이 관심있는 유형이 아닙니다. ID는 고유하지 않습니다. 동일한 레서피 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 :이 표는 이미 배치에 추가 된 레시피가 포함되어 있습니다. ID는 고유하지 않습니다. 동일한 제조법이 둘 이상의 배치에 추가 될 수 있습니다. 이 표에는 약 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 | 
    +-----------+----------+---------------------+ 
    

    답변

    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) 
    
    +0

    나는 당신의 논리에 분명히 동의합니다. 이미 분류 된 것을 가져 와서 그 결과로 다른 테이블에서 나머지 데이터를 삭제하면됩니다. – Jhecht

    +0

    예 그가 실제로 DELETE를 실행하거나 그냥 ID 목록을 가져 오는지 잘 모르겠습니다. – SQLChao

    +0

    그래, 네가 무슨 말하는지 알지. 나는 우리가 거꾸로 일하고 있다고 생각합니다. 먼저 여과 된 것들을 얻은 다음 큰 것들을 다루는 것입니다. 웬일인지 그는 바늘을 얻을 때까지 건초 더미에서 시작하여 더미를 얇게 만들고 싶어합니다. – Jhecht

    관련 문제