2016-07-19 2 views
2

내가 쿼리를 알아 내기 위해 노력 해왔다하고가는이 좋아하는 MySQL의 유사성 나는 테이블 카테고리를카운트가

table ingredient 
id int pk 
name varchar(50) 

을, 모든 성분 하나 이상의 카테고리가 연결될 수 있습니다. 예를 들어 아이스크림이 디저트, 차가운 음식 등 카테고리와 관련 될 수 있습니다. 그래서 많은 관계가 있습니다.

table category 
id int pk 
name varchar(50) 

table category_ingredient 
category_id int 
ingredient_id int 

내가 말하는 두 가지 성분이 얼마나 유사한 지에 대한 질문을하고 싶습니다. 내 데이터베이스가 3 가지 성분을 포함하고 있다고 가정 해 봅시다 : 1,2,3. 성분 1은 카테고리 {1,2,3}에 연결되고, 성분 2는 카테고리 3,4,5에 연결되고, 성분 3은 카테고리 1,2,3,4에 연결됩니다.

내가 1 성분과 가장 유사한 재료를 검색 할 쿼리를 수행, 결과 것이다 :

Ingredient 3 100% 
Ingredient 2 33% 

이런 종류의 질의을 달성 할 것입니다 방법에 대한 생각?

+0

왜 '성분 3'은 '성분 1'과 100 % 유사합니까? ** 성분 ** A **는 카테고리가 1이고 성분 B **는 카테고리 1,2,3을 가지고있는 것으로 잘못 생각합니다. 이것은 B가 A와 100 % 유사 함을 의미합니다. B가 A 검색에서 기능하지 않는 추가 카테고리를 가지고 있기 때문에 최고 33 %입니다. – Martin

+0

위의 논리를 질문에 주어진 예제에 적용하려면 성분 3은 성분 1이 나타나지 않는 한 카테고리 (총 4 개)를 갖기 때문에 **는 ** 100 %가 아니라 75 %입니다. – Martin

+0

@Martin 나는 그가 다른 성분에 존재하는 한 성분의 카테고리의 비율을 알고 싶어한다고 생각합니다. –

답변

0

이 쿼리를 수행하는 "멋진"방법은 CASE WHEN ... IN 표현식과 관련된 조건부 집계를 사용하는 것이지만 MySQL은이를 지원하지 않는 것 같습니다. 대신, 전체 category_ingredient 테이블에 대해 첫 번째 성분에 대한 십자가 조인을 수행하고 각 성분에 대해 공통적 인 카테고리 수를 계산합니다. 이 수를 첫 번째 구성 요소의 총 범주 수로 나눈 값은 공통적 인 비율을 나타냅니다.

SELECT t2.ingredient_id, 
    100 * SUM(CASE WHEN t1.category_id = t2.category_id THEN 1 ELSE 0 END)/
    (SELECT COUNT(*) FROM category_ingredient WHERE ingredient_id = 1) AS commonCount 
FROM category_ingredient t1 
INNER JOIN category_ingredient t2 
    ON t1.ingredient_id = 1 
GROUP BY t2.ingredient_id 
+0

이 쿼리를 테스트 해 보셨습니까? –

+0

오, 멋지다, 정확하게 그것이했던 것을 계산하는 작은 시간이 걸렸다 - 청초하다! 감사! – mrmjauh

관련 문제