2016-08-22 2 views
0

두 개의 테이블이 있습니다. 하나는 아이템이고 하나는 이베이 목록입니다. 주어진 항목에 대해 여러 개의 이베이 목록이있을 수 있습니다.뷰에서 mysql join에서 중복을 방지합니다.

나는 이베이 테이블을 포함하여 여러 테이블에서 많은 가격 정보를 집계 (왼쪽 조인)하는 뷰를 가지고 있습니다.

e.custom_labeli.id으로 시작하지만 정확히 일치하는 것은 아닙니다.

SELECT i.id, i.price AS master_price, e.price AS ebay_price 
FROM items i 
LEFT JOIN ebay e ON ((e.custom_label LIKE CONVERT(concat(i.id,'%') using latin1))) 

이것은 크게 단순화되었지만 문제를 설명해야합니다. 때문에 ON 문을 일치합니다 여러 이베이 리스팅 데, 예상대로

item master_price ebay_price 
1234  29.95   29.95 
1235  36.95   29.95 
1235  36.95   29.95 

은 일반적으로 우리가 필터링 조인에 ebay tabel 대신에 하위 쿼리를 사용하는 것처럼, 당신이 뭔가를 얻을 것이다 사본이지만, 이것이보기이기 때문에 우리는 할 수 없습니다. 이렇게하면 조인 된 테이블에서 그룹을 수행하지 못하게됩니다. 뷰에서 기본 테이블을 편집 가능하게 유지하는 방식으로 중복을 필터링하는 다른 방법이 있습니까?

이 견해로는 모든 eBay 가격이 동일한 지 확인하는 것보다 가격을 책정하는 것이 더 중요합니다 (제품이 eBay에 등재되어 있음을 알고 있음). UI는 항목 당 하나의 행만있을 것이라는 점에 의존합니다.

+0

왜 뷰에서 하위 쿼리를 사용할 수 없습니까? 너 해봤 어? 길게 짧게, 당신은'GROUP BY item'을 시도 했습니까? –

+0

예. (예 : http://stackoverflow.com/questions/17983379/mysql-error-1349-what-i-am-missing) – Mike

+0

MySQL에서보기를 너무 많이 만들지 않기 전에, 큰 테이블의 성능 영향을 이해하십시오. 외부 쿼리의 술어는 뷰 쿼리로 푸시 다운되지 않으며 뷰 쿼리의 결과는 항상 인덱스가없는 파생 테이블로 나타납니다. (파생 테이블에 대한 인덱스가없는 부분은 MySQL의 최신 릴리스에서 부분적으로 다룹니다.) ** Danger, Will Robinson. Danger! ** – spencer7593

답변

0

하나의 열만 있기 때문에 SELECT 목록에서 상관 된 하위 쿼리를 사용할 수 있다고 생각합니다. 그가되어 있는지,

내 뇌가 조인 조건을 감싸받지 못했습니다을 (내가! 질문에 대한 내 댓글 ... 위험, 윌 로빈슨, 위험의 훈계를 반복 것) 일을 할 ...

i.id = ((e.custom_label LIKE CONVERT(concat(i.id,'%') using latin1))) 

e.custom_label LIKE foo

은 부울을 반환하는 것입니다. TRUE, FALSE 또는 NULL 값. 수치 적 맥락에서 평가 된 부울은 1, 0 또는 NULL이 될 것입니다. 그 결과를 가져 와서 id 열과 동등한 비교를하면 ... 전체 표현식이 1 또는 0이 아닌 다른 id 값에 대해 TRUE로 평가되는 이유는 무엇입니까?

하지만 다시 custom_label의 첫 번째 부분에 일치하는 전체 사업은 나에게 다소 기괴한 것 같습니다. , 값을 item.id하는 일치하는데이 같은 주어진 이베이에서 행

하십시오 상관 관계가 왜

item.id 
------- 
     12 
    123 

ebay.custom_label 
----------------- 
122 
123 
1234 
12345 

하지만 옆으로 전체 사업을 ...

는 잘 모르겠어요 SELECT 목록의 하위 쿼리가 작동하지 않습니다. 예로서. (사용 어떤 "일치 조건"당신이 상관 하위 쿼리의 WHERE 절에 필요합니다.)

SELECT i.id 
    , i.price AS master_price 
    , (SELECT e.price 
      FROM ebay e 
      WHERE e.custom_label REGEXP CONCAT('^',i.id) 
      LIMIT 1 
     ) AS ebay_price 
    FROM items i 

저장된 뷰 정의에 일부 제한이있을 수 있습니다. (저장된 뷰 정의에 대한 경험이별로 없기 때문에 도입 될 수있는 문제의 종류로 인해 저장된 뷰 정의를 생성하지 않아도되고 저장된 뷰 정의가 해결해야 할 문제보다 훨씬 큰 문제가 발생할 수 있습니다.)

+0

와우들, 실제 조인은'LEFT JOIN cffhub_channel_ebay e on ((e.custom_label like convert (concat (p.posid, '%') latin1)))'... 단순화 할 때 망쳐 버릴 수 있습니다. 이 답변을 주셔서 감사합니다. – Mike

관련 문제