2015-02-05 2 views
0

나는 현재 완벽하게 작동 다음 쿼리 사용 :MySQL의 : 카테고리별로 분류 항목 계산

SELECT * FROM `items` WHERE `id` IN 
    (SELECT `item_id` FROM `categories_items` 
    WHERE `category_id` IN (1, 2) GROUP BY `item_id` 
    HAVING COUNT(`item_id`) = 2); 

그것은 모든 선택 (체크 박스)의 범주에있는 모든 항목을 선택합니다.

문제는 대부분의 항목이 여러 범주에 있고 몇 가지 항목이 두 범주에만 있고 그 중 두 항목 만 확인하면 여전히 수백 개의 항목 목록이 표시되어 항목을 찾을 수 없다는 것입니다. 몇 가지 범주에 속합니다.

내 첫 번째 아이디어는 어딘가에 쿼리에 ORDER BY "number_of_total_categories_that_the_selected_item_is_in" ASC을 추가하는 것이었지만 현재의 도움말을 얻었고 아마도 많은 계산/하위 쿼리가 작동하기 때문에 추가 열을 생각했습니다. 그 안에있는 카테고리 수를 보유 할 테이블 items!

  • 효과적인 ORDER BY 절을 쿼리에 추가 할 수 있습니까? 그렇다면 어떤 모양입니까?
  • 다른 아이디어가 있습니까? "거꾸로 된"외래 키 솔루션이 여기에서 작동합니까? 기회는 아니지, 그렇지? : p

만약 내가 필요하다고 생각하면 수동으로 category_count 열을 items 번으로 업데이트해야한다고 생각할 수 있습니다.

편집 : Table field that holds row count from another table이 재미있어 보이지만 MySQL에서 작동하는지는 잘 모릅니다.

답변

1

in 대신 join을 사용하려고합니다. 다음 쿼리는 원하는 두 범주 만 포함하는 항목을 필터링합니다. 또한 order by에 사용할 수있는 범주의 총 ​​수를 계산 :

SELECT i.* 
FROM `items` i JOIN 
     (SELECT `item_id`, COUNT(*) as cnt 
     FROM `categories_items` 
     WHERE `category_id` IN (1, 2) 
     GROUP BY `item_id` 
     HAVING COUNT(DISTINCT CASE WHEN category_id IN (1, 2) THEN category_id END) = 2 
     ) c 
     ON i.id = c.item_id 
ORDER BY cnt ASC; 

편집 :

당신이 모든 범주를 계산하려면, 다음 where 제거. 실제로 아무 것도하지 않습니다.

SELECT i.* 
FROM `items` i JOIN 
     (SELECT `item_id`, COUNT(*) as cnt 
     FROM `categories_items` 
     GROUP BY `item_id` 
     HAVING COUNT(DISTINCT CASE WHEN category_id IN (1, 2) THEN category_id END) = 2 
     ) c 
     ON i.id = c.item_id 
ORDER BY cnt ASC; 
+0

답장을 보내 주셔서 감사합니다. SELECT는 작동하지만 ORDER BY는 작동하지 않습니다. 문제는 쿼리가 각 항목이있는 모든 항목 대신 선택된 범주를 계산한다는 것입니다. – LGT

+0

몇 가지 테스트를 마치면 이것이 완벽하게 작동하는 것 같습니다! 나는 그것을 많이 고맙다. – LGT