2014-04-28 5 views
0

나는 4 개의 테이블을 가지고 있습니다 : users, orders, orders_productproducts입니다. 그들은 외래 키다중 내부 조인 사용

사용자 테이블에 의해 서로 연결되어 에는 다음이 포함 id, name, emailusername을.

제품 테이블에는 다음이 포함 id, product_name, product_descriptionproduct_price

주문 테이블에는 다음이 포함 idu_id(foreign key).

orders_product table contains : id, product_id(foreign key), order_id(foreign key).

지금 나는 그가 배치했다고 특정 순서의 총 가격을 가진 사용자의 이름을 가져 오기 위해 노력했다.

SELECT prod.order_id, 
     SUM(product_price) AS Total 
FROM products 
INNER JOIN 
    (SELECT orders.id AS order_id, 
      orders_product.product_id 
    FROM orders 
    INNER JOIN orders_product ON orders.id = orders_product.order_id 
    WHERE order_id=1) AS prod ON products.id = prod.product_id; 

그것은 나에게 특정 순서의 총 가격을 보여 주었다 :

내가 갔다 할 수있는 최대는 다음과 같이이었다. 이제 두 가지 질문이 있습니다.

  1. 해당 쿼리가 정확합니까? 아주 긴 쿼리처럼 보입니다. 작은 결과로 동일한 결과를 얻을 수 있습니까? 그가 배치했다고 특정 순서의 총 가격을 가진 사용자의 이름을 인출하는 방법

  2. .

+0

왜 주문이라는 별도의 표가 필요합니까? 그것을 제거 할 수 있습니다. – jack

답변

1

귀하의 질의는 하나 개의 주문에 대한 정확하지만,이 향상 될 수있다 :

  • 이 필요한 경우를 제외하고 하위 쿼리를 사용하지 마십시오. MySQL에서는 추가 오버 헤드가 발생합니다.
  • 경량 사이트에서 보이는 것만 한 주문입니다. where 절을 제거해야합니다. 당신이 집계를 원하기 때문에
  • 당신은 group by를 사용한다.
  • 이름을 얻으려면 사용자 테이블에 가입해야합니다.

나는 또한 테이블 별칭 (테이블 이름에 대한 약어) 추가.

SELECT u.name, SUM(p.product_price) as Total 
FROM orders_product op INNER JOIN 
    orders o 
    ON o.id = op.order_id INNER JOIN 
    products p 
    ON p.id = op.product_id INNER JOIN 
    users u 
    on o.userid = u.id 
WHERE op.order_id = 1 
GROUP BY u.name; 
+0

대괄호를 추가 할 수 있습니까? ... 여기에는 내부 조인이 많이 있습니다. D. 큰 도움이 될 것입니다. 감사. – Kanav

+0

@ user170654 . . 나는 할 수있다. 그러나 나는하지 않을 것이다. 나는'from' 절의 괄호가 쿼리의 의도를 훨씬 더 어렵게 만든다는 것을 알았다. 쿼리를 읽는 방법을 배워야합니다. 첫 번째 테이블 쌍부터 시작하여 계속 진행합니다. –

+0

그러면 따라하기 어려운 쿼리를 설명 할 수 있습니까? – Kanav

1

안녕 쿼리가 확인 보인다 @Gordon Linoff 몇 가지 추가 :이 조금 더 읽기 쿼리를합니다. order_products에 가격 데이터를 저장하면 이익이 발생하고 이점 중 하나는 집계가 간단하다는 것입니다. 제품 가격이 변경되면 주문에 영향을 미치지 않는다는 두 번째 이점.

0

당신의 SQL이 잘못되었습니다. 왜냐하면 당신은 특정 사용자를 계산하기를 원하기 때문입니다. 그러나 귀하의 SQL은 주문에만 국한됩니다. 귀하의 SQL은 One Order에 대한 결과를 제공합니다. 사용자 이름이나 고유 한 이름을 지정하여 사용자 별로 지정하십시오.