2009-05-25 11 views
1

私は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_packages_idとrate_package_document_idを請求書テーブルに追加する以外はiedaを持っていないので、rate_pricesから価格を直接照会することができます。

答えて

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クエリです。 Oracleでは、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以上のラインを持つことができますアイテム。

関連する問題