2016-06-18 2 views
1

저는 SQL에 대해 아주 익숙하며 질의에 대한 도움을 얻고 싶습니다. 내가 좋아하는 것가격 및 카테고리를 기준으로 제품 선택 -SQL Request

#product 
------------------------------------------ 
| product_id | title | date | price | lang | 
------------------------------------------ 

#product_to_categories 
------------------------------- 
| id | category_id | product_id | 
------------------------------- 

#category 
-------------------- 
| category_id | name | 
-------------------- 

특정 랭이 특정 범주에 속하는 모든 제품을 선택합니다 :

나는 다음과 같은 테이블이있다.

하나의 요청으로 할 수있는 방법이 있습니까? 아니면 먼저 특정 랭이있는 모든 제품을 선택한 다음 제품 대 카테고리 테이블에 있는지 하나씩 살펴보아야합니까?

답변

2

SQLFiddle에서 상호 작용하는 예를 참조하십시오

SELECT 
    p.title, 
    c.name as category 
FROM product p 
INNER JOIN product_to_categories pc on pc.product_id = p.product_id 
INNER JOIN category c on c.category_id = pc.category_id 
WHERE p.lang='en' and c.category_id in (3, 4) 

로 보일 것이다 결과의 예는 다음과 같습니다

--------------- 
title | name 
--------------- 
Apple | Green 
Apple | Red 
Kiwi | Green 

그룹화 범주

당신이 그룹에 원하는 경우 내용, postgres (9.0 이후)에는 0이라고하는 built in function이 있습니다.
SELECT 
    p.title, 
    string_agg(c.name, ', ') as category 
FROM product p 
INNER JOIN product_to_categories pc on pc.product_id = p.product_id 
INNER JOIN category c on c.category_id = pc.category_id 
WHERE p.lang='en' and c.category_id in (1, 3) 
GROUP BY p.product_id, p.title 
ORDER BY p.title 

SQLFiddle에서 상호 작용하는 예를 참조하십시오 다음과 같이 스크립트를 조작 할 경우 사용할 수 1,231,375,.

로 보일 것이다 결과의 예는 다음과 같습니다의

--------------- 
title | name 
--------------- 
Apple | Red, Green 
Kiwi | Green 

설명은 당신이 당신의 결과 세트와 상호 작용하는 방법을 이해하면 이해 SQL 조인

은 간단 결합합니다. 다음은 great reference입니다. 이미지는이 게시물에서 halfgaar에 의해 참조됩니다.

  • INNER는 반환 두 결과 집합이 교차 세트 가입하세요.

    Depiction of an INNER JOIN

    • LEFT OUTER가 가입
  • 왼쪽 결과 집합의 모든 행이 왼쪽과 교차 권리 세트에서 존재하지만 행있는 집합을 반환합니다.

    Depiction of a LEFT OUTER JOIN

    • RIGHT OUTER가 가입
    는 조인 LEFT OUTER 그러나 반대로 같은 않습니다.

    Depiction of a RIGHT OUTER JOIN

    • FULL OUTER가 가입
    하나 개의 큰 결과 집합에 두 세트를 결합합니다.

Depiction of a FULL OUTER JOIN

+0

답변 해 주셔서 감사합니다. 그러나 제품이 여러 범주에 영향을받는 경우 어떻게 반환됩니까? 동일한 제품의 여러 줄이 각 카테고리 이름과 함께 있습니까? – Anselme

+0

기사에서 언급 한 SQL 바이올린 링크를 사용하여 실행할 수 있지만 결과 샘플을 제공하기 위해 응답을 업데이트했습니다. 제품에 대한 범주가 여러 개인 경우 해당 제품의 여러 행을 반환합니다. 어떻게 데이터를 반환 할 것인지 예를 제공 할 수 있습니까? – cbillowes

+0

SQL 피들 (SQL Fiddle)에 감사드립니다. 매우 훌륭합니다. 어떻게 든 나는 같은 제품의 중복 된 행을 피하고 제품이 severa 카테고리에 속하면 제품 행에있는 모든 카테고리 이름을 혼수로 구분하여 그룹화합니다. 나는 이것이 GROUP By 절이 유용하지 않은 곳이라고 생각한다. – Anselme

2
SELECT  dbo.product.lang, dbo.product.product_id, dbo.product.title, dbo.product.date, dbo.product.prize, dbo.category.category_id AS Expr1 
FROM   dbo.product_to_categories INNER JOIN 
         dbo.product ON dbo.product_to_categories.product_id = dbo.product.product_id INNER JOIN 
         dbo.category ON dbo.product_to_categories.category_id = dbo.category.category_id 
WHERE  (dbo.product.lang = N'desiredang') AND (dbo.category.category_id = 'desired category id') 
+0

고마워요! where 절에 범주 ID 배열을 제공하는 방법이 있습니까? – Anselme

+0

(id1, id2, id3, od4)의 dbo.category.category_id) – Whencesoever

관련 문제