2012-04-16 3 views
0

나는이 다음 표 (그들은 모두 더 많은 열을 가지고 있지만 난 그냥 관심있는 것들을 보여주는거야)독점 mysql을 선택 쿼리, 두 개의 테이블

Product       Order details     Orders 
---------------------------- ---------------------------- -------------- 
| id_product | id_supplier | | id_order | id_product | | id_order | 
|  12  |  2  | |  1  |  56  | |  1  | 
|  32  |  4  | |  2  |  32  | |  2  | 
|  56  |  2  | |  2  |  56  | |  3  | 
|  10  |  1  | |  4  |  56  | |  4  | 
---------------------------- |  3  |  12  | -------------- 
           ---------------------------- 

는 내가하고 싶은 것은 모든 주문을 선택입니다있는 제품은 에만 하나 이상의 공급 업체가 있습니다. 그래서 나는 단지 ID 2와 공급 업체의 제품이있는 모든 주문을 원하는 말할 수 (id_supplier = 2)가 제품을 가지고 모든 주문을 원하는 경우에 나는 ID 1, 3, 4

로 주문을 얻어야한다 id 4 (id_supplier = 4) 인 공급자로부터 빈 결과를 얻어야합니다.

내가 나는 다음과 같은 질문을 읽은 2.

내가 ID로 순서를 얻어야한다 2 4 ID와 공급 업체의 제품을 가지고 모든 주문하려면 다음 mySQL exclusive records를하지만 내가 할 수있는 내가 가지고있는 것처럼 두 개의 테이블을 가지고있을 때 그 쿼리를 이해할 수는 없습니다. 나는 여기서 나를 도울 다른 눈 쌍이 필요해! :)

내가 어떻게 할 지 아십니까?

EDIT : 명확화를 위해 하나 이상의 지정된 공급 업체의 제품 만 포함하는 모든 주문을 가져 오려고합니다. 명시되지 않은 다른 공급자의 제품을 사용한 주문은 포함되지 않아야합니다.

+0

설명 ... 공급 업체의 조건 = 4는 id_product = 32 인 id_supplier를 통해 주문 ID 2를 반환해야합니다. 4. 다음으로 공급 업체 2와 4를 참조하십시오. 이는 두 가지를 의미 할 수 있습니다. ONE - 공급 업체가 2 또는 4 인 모든 주문 ... 2 - 제품이 최소한 두 공급 업체에 의해 표시되어야하는 모든 주문. 따라서 하나의 주문 X에만 공급 업체 2가 있고 Y 주문에 공급 업체 4 만 있지만 Z 주문에 공급 업체 2와 공급 업체 4의 제품이 모두있는 경우 주문 Z를 보려는 경우 이것이 도움이되는지 묻습니다. – DRapp

+0

예, 정확하게. 내가해야한다고 분명히 했어야했다. 공급자 2와 4가 명시된 경우, 주문서에는 해당 공급자의 제품 만 포함되어야합니다. – Bazze

+0

그럼, 목록에있는 옵션 중 하나 일 것입니다. 공급 업체가 순서에 상관없이 ... 하나가 될 수도 있고, 다른 하나가 될 수도 있고, 또는 둘 모두가 질의에 적합한 것으로 해당 주문을 포함 할 수도 있습니다 ... 기존 대답이 그것을 처리해야합니다. – DRapp

답변

1

을 질문에 따라 말하면서 단지 1을 요구할 수 있습니다. 나는 이것이 당신이 원하는 것이며, LEFT join으로 할 수 있다고 생각합니다.

select 
     od.id_order, 
     sum(if(p.id_supplier in (2, 4), 1, 0)) as HasSupplierLookingFor, 
     sum(if(p.id_supplier in (2, 4), 0, 1)) as HasOtherSuppliers 
    from 
     order_Details od 
     join product p 
      on od.id_product = p.id_product 
    group by 
     od.id_order 
    having 
      HasSupplierLookingFor > 0 
     AND HasOtherSuppliers = 0 

때로는 제시된 것처럼 다소 모호한 질문에 답하는 것이 잘못된 답변으로 이어지는 경우가 있습니다. 이 쿼리는 주문 단위로 제품에 가입하여 주문 ID별로 공급 업체 및 그룹을 찾습니다.

주문한 각 제품에 대해 첫 번째 SUM()은 찾고자하는 공급 업체가 있는지 묻습니다. 그렇다면 1의 값을 합계합니다. 그렇지 않으면 0 ... 다음 SUM()은 동일한 것을 묻습니다. ..하지만 공급 업체라면 0을 사용하십시오. 따라서 다른 모든 공급 업체는 1을받습니다.

이제 HAVING 절은 최소한 공급 업체 중 1 개가 자격을 갖춘 주문을 찾고 있으며 다른 공급 업체가 대표합니다.

따라서 30 개 항목과 20 개 공급 업체 2 개 주문, 10 개 공급 업체 4 개 주문이 가능합니다.HasSupplierLookingFor는 = 30이고 HasOtherSuppliers = 0은 순서가 포함됩니다.

다른 주문에는 5 개의 품목이있을 수 있습니다. 하나는 공급 업체 2에서, 다른 하나는 공급 업체 9에서 가져온 것입니다. 이것은 HasSupplierLookingFor = 1 및 HasOtherSuppliers = 4를 가지므로이 주문을 적격 주문으로 제외하십시오.

+0

이것은 순수 예술입니다. 도움을 주신 데 대해 감사 드리며 질문을 철저하게 설명해 주셔서 감사드립니다. – Bazze

0

join을 사용하십시오.

SELECT o.* from Orders o 
    INNER JOIN Details d ON o.id_order = d.id_order 
    INNER JOIN Products p ON d.id_product = p.id_product 
    WHERE p.id_supplier = 4 

: 내부 조인

이 왼쪽 및 오른쪽이 가입하는 모든 행에 대한 것은 당신이 유일한 (null이 아닌) 행

0

당신 내면의이 같은 모든 테이블을 가입해야합니다 위해, 필요하다 그러면 해당 공급 업체의 제품을 포함하는 주문이 제공됩니다.

+0

불행히도 이것은 트릭을하지 않습니다. 주문은 여러 공급 업체의 제품을 많이 가질 수 있으므로 원하는 공급 업체가있는 주문 만 가져 오는 것이 좋습니다. 귀하가 저에게 보여 준이 쿼리는 지정된 공급 업체의 제품이 있지만 독점적으로 해당 공급 업체가 아닌 모든 주문을 가져옵니다. – Bazze

0
SELECT o.id_order 
FROM Orders o 
    INNER JOIN `Order details` od 
     ON o.id_order = od.id_order 
    INNER JOIN Product p 
     ON p.id_product = od.id_product 
WHERE p.id_supplier IN (2,4) 

(2,4)는 가져 오려는 공급 업체입니다. 당신은 또한 (2)

+0

불행히도 이것은 트릭을하지 않습니다. 주문은 여러 공급 업체의 제품을 많이 가질 수 있으므로 원하는 공급 업체가있는 주문 만 가져 오는 것이 좋습니다. 귀하가 저에게 보여 준이 쿼리는 지정된 공급 업체의 제품이 있지만 독점적으로 해당 공급 업체가 아닌 모든 주문을 가져옵니다. – Bazze