2010-04-26 5 views
2

안녕하세요, 저는 특정 MySQL Join 쿼리를 작성하는 데 어려움을 겪고 있습니다.MySQL 가입 질문

제품 데이터가 포함 된 표가 있습니다. 각 제품은 여러 카테고리에 속할 수 있습니다. 이 m : m 관계는 링크 테이블을 사용하여 충족됩니다.

이 특정 쿼리의 경우 특정 카테고리에 속한 모든 제품을 검색하려고하지만 각 제품 레코드와 함께 해당 제품이 속한 다른 범주도 반환하고자합니다.

각 제품 레코드에 대한 추가 쿼리를 수행하는 대신 범주 테이블에서 내부 조인을 사용하여이 작업을 수행하는 것이 이상적입니다. 이는 매우 비효율적입니다. 다음과 같이

내 simplifed 스키마는 대략 설계되었습니다

제품 테이블 :

product_id, name, title, description, is_active, date_added, publish_date, etc.... 

카테고리 테이블 :

category_id, name, title, description, etc... 

PRODUCT_CATEGORY 테이블 :

product_id, category_id 

I의 시간 ave는 지정된 category_id에 속한 모든 제품을 검색 할 수있는 다음 쿼리를 작성했습니다. 그러나, 나는 정말 제품이 속한 다른 범주를 검색하는 방법을 찾기 위해 고투하고있다. 내가 객체에 저장된 모든 카테고리 데이터가되고, 내 응용 프로그램 코드가 알아서 수

SELECT p.product_id, p.name, p.title, p.description 
FROM prod_products AS p 
LEFT JOIN prod_product_category AS pc 
ON pc.product_id = p.product_id 
WHERE pc.category_id = $category_id 
AND UNIX_TIMESTAMP(p.publish_date) < UNIX_TIMESTAMP() 
AND p.is_active = 1 
ORDER BY p.name ASC 

나는 그냥 카테고리 ID의 각 releated 반환 제품 행을 검색 드리겠습니다.

많은 감사,

리처드

답변

1
SELECT p.product_id, p.name, p.title, p.description, 
    GROUP_CONCAT(otherc.category_id) AS other_categories 
FROM prod_products AS p 
JOIN prod_product_category AS pc 
    ON pc.product_id = p.product_id 
LEFT JOIN prod_product_category AS otherc 
    ON otherc.product_id = p.product_id AND otherc.category_id != pc.category_id 
WHERE pc.category_id = $category_id 
    AND UNIX_TIMESTAMP(p.publish_date) < UNIX_TIMESTAMP() 
    AND p.is_active = 1 
GROUP BY p.product_id 
ORDER BY p.name ASC 
+0

대단히 감사합니다. 나는 그 테이블에 대한 조인을 두 번째로 수행 할 생각이 없었으며 연산자가 아닌 연산자를 사용했습니다. – rbaker86

0

당신은 내부 사용하는 것이이 왼쪽을하고는 PRODUCT_CATEGORY 테이블에 가입하면 조건에서의 값을 사용으로 무의미이 가입 ​​할 수 있습니다. 그런 다음 product_category 테이블에서 왼쪽 조인을 수행하여 다른 카테고리를 가져 와서 데이터 카테고리에 가입하십시오.

select 
    p.product_id, p.name, p.title, p.description, 
    c.category_id, c.name, c.title 
from 
    prod_products p 
    inner join prod_product_category pc on pc.product_id = p.product_id 
    left join prod_product_category pc2 on pc2.product_id = p.product_id 
    left join prod_categories c on c.category_id = pc2.category_id 
where 
    pc.category_id = @category_id and 
    unix_timestamp(p.publish_date) < unix_timestamp() and 
    p.is_active = 1 
order by 
    p.name