2009-05-25 5 views
1

나는 하루에 약 500 송장을 처리하는 백엔드를 개발 중이다. 데이터베이스에 다음 테이블이 있습니다.각 인보이스의 가격은 어떻게 받습니까?

invoices 
invoice_id int primary_key auto_increment 
user_id varchar(10) 
invoice_type enum { package, document } 


users 
user_id int primary_key auto_increment 
rate_package_id int 
rate_document_id int 

rates 
rate_id int 
rate_name varchar(10) 

rate_prices 
price_id int primary_key auto_increment 
rate_id int 
weight int 
price double(8,2) 

하루가 끝날 때마다 인보이스마다 가격을 설정해야합니다.

각 인보이스의 가격은 어떻게 받나요? 실제로 rate_prices에서 가격을 쿼리 할 수 ​​있도록 'rate_package_id'및 'rate_package_document_id'를 송장 테이블에 추가하는 것 외에는 ieda가 없습니다.

답변

3
SELECT invoice_id, price 
FROM invoices i 
JOIN users u 
ON  u.user_id = i.user_id 
JOIN rates r 
ON  r.rate_id = CASE WHEN i.invoice_type = package THEN u.rate_package_id ELSE u.rate_document_id END 
JOIN rate_prices p 
ON  p.rate_id = r.rate_id 

귀하의 패키지 무게는 어디에 보관하십니까?

invoices이어야하며,이 경우 마지막 JOIN 조건에 추가하십시오.

+0

Quassnoi // Thanks! 꽤 긴 SQL 쿼리입니다. – Moon

+1

아주 짧은 SQL 쿼리입니다. 오라클에서 나는 VARCHAR2 (32767)에 맞지 않는 동적 인 SQL 쿼리를 가지고있다. 꽤 긴 쿼리이다. – Quassnoi

+2

Quassnoi : 그건 아무것도 아니다! 어렸을 때 우리는 너무 오랫동안 쿼리를 작성해야했지만 여전히 최적화를 기다리고 있습니다! ;-) –

1

나는 같은, 당신은 아마 송장과 연관 될 것 LineItems 테이블을 필요 가정

lineitem_id int primary_key auto_increment 
invoice_id int 
price_id int 
quantity int 
total_price double(8,2) 

당신이 다음 인보이스 가격을 연결하는 테이블이 각 송장은 1 개 이상의 라인을 가질 수있다 항목.

관련 문제