2010-12-11 4 views
3

다른 필드에서 최소 값을 갖는 레코드 목록을 선택하면 레코드 목록을 필터링하여 일부 필드가있는 레코드를 어떻게 제거합니까? 최소값을 얻는 것만으로는 충분하지 않습니다 ... 동일한 레코드의 다른 필드가 필요합니다.SQL Select : 다른 필드를 기반으로 올바른 고유 레코드 선택

"제품"테이블이 있는데 쿠폰 코드를 적용 할 수있는 기능을 추가하려고합니다. 송장이 생성되는 방법 때문에 다른 비용으로 제품을 판매하는 것이 다른 제품으로 간주됩니다. 데이터베이스에서이 나타날 수 있습니다 : 지금 사용 가능한 모든 제품의 목록을 선택하는 조회를

Product ID, Product Cost, Product Name, Coupon Code 
    1,   20,   Product1,  null 
    2,   10,   Product1, COUPON1 
    3,   40,   Product2,  null 

(다른 기준에 따라, 나는이 많이 단순화하고 있습니다). 문제는 위의 경우에, 내 쿼리가 반환한다는 것입니다 : 이것은 고객 (그들이 쿠폰 코드를 입력 한 가정)에 표시됩니다

1 - Product1 for $20 
    2 - Product1 for $10 
    3 - Product2 for $40 

, 그리고 고객에게 동일 제품을 보여주기 위해 분명히 나쁜 형태의 두 가지 가격. 내가 원하는 것은 :

2 - Product1 for $10 
    3 - Product2 for $40 

즉, 각 제품의 최저가 버전을 보여줍니다.

나는 MySQL을 위해 작동 할 해결책이 필요하지만, 표준 SQL이 해결책이 될 것이다.

+0

을 그 실제 열 이름이 있습니까? 열 이름의 공백은 열 이름의 인용을 잊어 버리면 문제를 일으킬 수 있습니다. –

+0

@ Mark Nope ... 이해하기 쉽도록 많은 것을 단순화해야했습니다. 아마 혼란을 피하기 위해 밑줄을 사용해야했습니다. –

답변

3

이 시도 : 첫번째 줄을 다음과 같이 대치 문자열로 설명

SELECT T2.* 
FROM 
(
    SELECT `Product Name` AS name, MIN(`Product Cost`) AS cost 
    FROM products 
    GROUP BY `Product Name` 
) T1 
JOIN products T2 
ON T1.name = T2.`Product Name` 
AND T1.cost = T2.`Product Cost` 

정확히 출력을 얻으려면 :

SELECT CONCAT(`Product ID`, ' - ', T1.name, ' for $', T1.cost) 
+0

동일 (이 경우 최저) 제품 원가를 가진 레코드가 두 개 이상있는 경우 중복 결과를 반환합니다. –

+0

고마워요, 그 말이 맞아요. 나는 그것이 내가 조인즈에 익숙해지기 시작해야 할 때라고 생각한다. –

관련 문제