2012-09-13 5 views
3

해당 파트 번호의 부품 번호와 가격을 보유한 테이블이 있습니다. 이것은 약 100000 개의 항목이있는 메인 테이블입니다. 또한 가능한 공급 업체가있는 3 개의 테이블이 있습니다. 메인 테이블의 모든 부품 번호가 모두 3 개의 공급 업체 테이블에있는 것은 아니며, 3 개의 공급 업체 테이블도 다른 내용을 가지고 있습니다.유니온에서 중복 된 항목을 모두 제거 할 수있는 쿼리

내가 원하는 것은 내 메인 테이블의 부품 번호에 대해 3 개의 테이블을 쿼리하는 것입니다. 부품 번호가 1보다 큰 테이블에서 발견되면 가장 낮은 가격을 반환해야합니다. 단 1 개의 테이블에서 발견되면 해당 부품의 가격을 반환하십시오.

은 내가 지금 뭐하는 거지하면 다음과 같은 쿼리입니다 :

SELECT `table1.partnumber`, 
    `table1`.`price`, 
    `maintable`.`price` 
FROM `table1` 
    INNER JOIN `maintable` 
     ON `table1`.`partnumber` = `maintable`.`partnumber` 
UNION ALL 
SELECT `table2`.`partnumber`, 
    `table2`.`price`, 
    `maintable`.`price` 
FROM `table2` 
    INNER JOIN `maintable` 
     ON `table2`.`partnumber` = `maintable`.`partnumber` 
UNION ALL 
SELECT `table3.partnumber`, 
    `table3`.`price`, 
    `maintable`.`price` 
FROM `table3` 
    INNER JOIN `maintable` 
     ON `table3`.`partnumber` = `maintable`.`partnumber` 

이 나에게 내가 필요로하는 모든 데이터를 제공하고, 그 후 나는 최저 가격 확인 foreach는 PHP 코드로 높은 가격 partnumbers를 제거합니다. 이것은 많은 양의 데이터에서 매우 느립니다.

나는 그 partnumber가 둘 이상의 테이블에 존재하는 경우에만 가장 낮은 가격의 partnumber를 얻는 방법이 있으며, 그것이 1 개의 테이블에만있는 경우 가격을 반환한다고 확신합니다. 난 그냥 그것에 대한 MySQL 데이터베이스를 쿼리하는 방법에 대한 단서가 없어. 내가 조인, 노동 조합, 분 및 별개의 조합을 사용하여했지만 아무 소용이 시도했다.

누군가 나를 도울 수 있습니까?

아래의 eggyal의 대답은 저를 도중에 보내줍니다. 나는 지금 나를 위해 일하는 다음 쿼리를 가지고있다 :

SELECT `partnumber`,MIN(`price`) as `price` 
FROM (
    SELECT `table1`.`partnumber`, 
     `table1`.`price`, 
     `maintable`.`price` 
    FROM `table1` 
     INNER JOIN `maintable` 
     ON `table1`.`partnumber` = `maintable`.`partnumber` 
    UNION ALL 
    SELECT `table2`.`partnumber`, 
     `table2`.`price`, 
     `maintable`.`price` 
    FROM `table2` 
     INNER JOIN `maintable` 
     ON `table2`.`partnumber` = `maintable`.`partnumber` 
    UNION ALL 
    SELECT `table3.partnumber`, 
     `table3`.`price`, 
     `maintable`.`price` 
    FROM `table3` 
     INNER JOIN `maintable` 
     ON `table3`.`partnumber` = `maintable`.`partnumber` 
) AS `part` GROUP BY `partnumber` 

아마 더 좋은 방법이있다. 나는이 모든 경우 귀찮다. 그러나 나는 위와 함께 행복하다는 것을 알고 있습니다.

답변

2
SELECT partnumber, MIN(price) FROM (
    SELECT 1 AS tn, partnumber, table1.price 
    FROM table1 JOIN maintable USING (partnumber) 
UNION ALL 
    SELECT 2 AS tn, partnumber, table2.price 
    FROM table2 JOIN maintable USING (partnumber) 
UNION ALL 
    SELECT 3 AS tn, partnumber, table3.price 
    FROM table3 JOIN maintable USING (partnumber) 
) t 
GROUP BY partnumber 
HAVING COUNT(DISTINCT tn) >= 2 
+0

답장을 보내 주시면 답변을 듣게 될 것입니다. 사용 된 솔루션이 내 질문에 추가되었습니다. –

+0

@MarcBuurke : 귀하의 솔루션은 나타나는 테이블의 수에 관계없이 모든 파트를 반환합니다. 귀하의 질문에 당신은 단지 하나 이상의 테이블에 존재하는 부품 번호를 원한다고 ... 또는 내가 오해 했습니까? – eggyal

+0

예, 당신이했거나 더 분명해야했습니다. 나는 하나의 테이블에만 나타나면 파트 넘버가 필요하다는 것을 강조하기 위해 질문을 편집했다. –