해당 파트 번호의 부품 번호와 가격을 보유한 테이블이 있습니다. 이것은 약 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`
아마 더 좋은 방법이있다. 나는이 모든 경우 귀찮다. 그러나 나는 위와 함께 행복하다는 것을 알고 있습니다.
답장을 보내 주시면 답변을 듣게 될 것입니다. 사용 된 솔루션이 내 질문에 추가되었습니다. –
@MarcBuurke : 귀하의 솔루션은 나타나는 테이블의 수에 관계없이 모든 파트를 반환합니다. 귀하의 질문에 당신은 단지 하나 이상의 테이블에 존재하는 부품 번호를 원한다고 ... 또는 내가 오해 했습니까? – eggyal
예, 당신이했거나 더 분명해야했습니다. 나는 하나의 테이블에만 나타나면 파트 넘버가 필요하다는 것을 강조하기 위해 질문을 편집했다. –