2015-02-03 1 views
2

까다로운 MySQL 쿼리에 대한 도움이 필요합니다.다른 모든 하위 레코드를 제외하고 모든 부모 레코드가 동일한 하위 레코드를 갖는 MySQL 선택 하위 레코드

성분

 
IngredientID | Name 
1    | Ketchup 


제품

 
ProductID | Name     | IngredientID 
1   | Bills Amazing Ketchup | 1 
2   | Marys Tasty Ketchup | 1 


RedFlags :

는 테이블 및 데이터입니다
ProductID | RedFlagID 
1   | 1 (Gluten) 
1   | 2 (Egg) 
2   | 1 (Gluten) 


조리 성분

는 여러 제품을 가질 수 있습니다. 예를 들어, 케첩 재료는 가게에서 선택할 다양한 종류의 케첩을 가질 수 있습니다.

이 경우 케첩에는 'Bills Amazing Ketchup'및 'Marys Tasty Ketchup'중에서 선택할 수있는 2 가지 제품이 있습니다.

각 제품에는 자체 규정 식 적혈구가 있습니다. 예를 들어 Bears Amazing Ketchup은 Gluten과 Egg를 포함하고 Marys Tasty Ketchup은 글루텐을 함유하고 있지만 egg는 포함하지 않습니다.

내가 원했던 것은 Ingredient show에 해당하는 Red Flags뿐입니다.

예를 들어, 두 제품 모두 글루텐을 포함하고 오직 1 개만 에그를 포함합니다. 따라서 달걀이 들어 있지 않은 제품이 존재하고 고객이 달걀이없는 대안을 구입할 수 있기 때문에 달걀이 케첩 성분의 적기가 아니므로 계란은 성분에 대해 적색으로 표시되어서는 안됩니다.

그러나 두 제품 모두 글루텐을 함유하고 있기 때문에 선택할 수있는 글루텐없는 대안이 없으므로 성분은 글루텐을 적기로 나타내야합니다. 데이터베이스가 제품을 많이 포함하고 있기 때문에이 쿼리는 빨라야

 
IngredientID | RedFlagID 
1   | 1 (Gluten) 

:

는 케첩 성분 따라서 다음과 같은 관련 데이터를 표시해야합니다.

나는 가능한 한 카운트가 부족하다는 것을 알고 싶지 않다.

감사합니다.

답변

0
SELECT count(crf.RedFlagID) as cnt, crf.RedFlagID 
    FROM RedFlags as crf 
    LEFT JOIN Products as p USING(ProductID) 
    WHERE IngredientID = :ingId 
    GROUP BY p.ProductID 
    ORDER BY cnt DESC 
    LIMIT 1 

또는, 당신이 IngredientID를 저장하는 테이블 RedFlags을 비정규 수 있습니다. 이 경우에는 가입하지 않고 간단한 선택이됩니다.

관련 문제