2013-08-18 48 views
1

我有3個表格:quotesquote_itemsproductsquotes有一個created_by字段,它對應於quote_items中的quote_id字段。 quote_items也有一個字段new_product_id,它對應於products中的id字段。 products也有一個price字段。在另一個查詢中使用內部連接的結果

我想運行一個查詢,獲取Total quoted value對於特定的created_by值。 我至今是:

SELECT `quote_items`.`new_product_id` FROM `quotes` 
INNER JOIN `quote_items` 
ON `quotes`.`id` = `quote_items`.`quote_id` Where `quotes`.`created_by` = 5 

這個方法返回的人創建的所有報價的全部產品ID與5 如何在這樣的結果,即運行查詢的最後一部分的ID 。獲取與每個產品ID相關的價格並將它們相加?

感謝

回答

1

試試這個:

SELECT SUM(p.price) Total_quoted_value 
FROM `quotes` 
INNER JOIN `quote_items` 
ON `quotes`.`id` = `quote_items`.`quote_id` 
INNER JOIN products p 
ON p.id = new_product_id 
Where `quotes`.`created_by` = 5 



-----編輯---------- 一個例子如何計算的平均價格

SELECT SUM(p.price) Total_quoted_value, AVG(p.price) Avg_value 
FROM `quotes` 
INNER JOIN `quote_items` 
ON `quotes`.`id` = `quote_items`.`quote_id` 
INNER JOIN products p 
ON p.id = new_product_id 
Where `quotes`.`created_by` = 5; 

指向sqlfiddle demo的鏈接



------編輯 - 什麼第二加入做--------------

一個簡短的說明,我們有三個表:

> select * from products 
+ ------- + ----------------- + ---------- + 
| id  | product_name  | price  | 
+ ------- + ----------------- + ---------- + 
| 1  | product 1   | 20   | 
| 2  | product 2   | 40   | 
| 3  | product 3   | 30   | 
| 4  | product 4   | 15   | 
| 5  | product 5   | 5   | 
+ ------- + ----------------- + ---------- + 

> select * from quotes 
+ ------- + --------------- + 
| id  | created_by  | 
+ ------- + --------------- + 
| 1  | 5    | 
| 2  | 4    | 
| 3  | 5    | 
| 4  | 1    | 
+ ------- + --------------- + 

> select * from quote_items 
+ ------------- + ------------------- + 
| quote_id  | new_product_id  | 
+ ------------- + ------------------- + 
| 1    | 1     | 
| 1    | 2     | 
| 1    | 4     | 
| 2    | 2     | 
| 2    | 3     | 
| 2    | 5     | 
| 3    | 1     | 
| 3    | 3     | 
| 4    | 2     | 
| 4    | 4     | 
| 4    | 5     | 
+ ------------- + ------------------- + 

釷e第一次加入:

SELECT * 
FROM `quotes` 
INNER JOIN `quote_items` 
ON `quotes`.`id` = `quote_items`.`quote_id` ; 

+ ------- + --------------- + ------------- + ------------------- + 
| id  | created_by  | quote_id  | new_product_id  | 
+ ------- + --------------- + ------------- + ------------------- + 
| 1  | 5    | 1    | 1     | 
| 1  | 5    | 1    | 2     | 
| 1  | 5    | 1    | 4     | 
| 2  | 4    | 2    | 2     | 
| 2  | 4    | 2    | 3     | 
| 2  | 4    | 2    | 5     | 
| 3  | 5    | 3    | 1     | 
| 3  | 5    | 3    | 3     | 
| 4  | 1    | 4    | 2     | 
| 4  | 1    | 4    | 4     | 
| 4  | 1    | 4    | 5     | 
+ ------- + --------------- + ------------- + ------------------- + 

我假設你知道一個簡單的連接是如何工作的,並且這裏不需要解釋。 如果沒有,那麼你可以在這裏找到一個很好的解釋:http://www.w3schools.com/sql/sql_join_inner.asp

我們主要關注第二個(組合)連接以及它是如何工作的。下面是我們的查詢:

SELECT * 
FROM quotes 
INNER JOIN quote_items 
ON quotes.id = quote_items.quote_id 
INNER JOIN products p 
ON p.id = new_product_id 

基本上這個查詢相當於一個簡單的,單一的加盟:

SELECT * 
FROM <<ResultSet_of_the_first_join>> 
INNER JOIN products p 
ON p.id = new_product_id 

其中< < ResultSet_of_the_first_join>>是一個結果(通過返回一組行的第一個加盟 - 內存中的一種虛擬表格)。

此連接(第二個)產生以下結果集:

+ ---- + ------------+ ----------+ --------------- + ----+ ------------- + ------ + 
| id | created_by | quote_id | new_product_id | id | product_name | price | 
+ ---- + ------------+ ----------+ --------------- + ----+ ------------- + ------ + 
| 1 | 5   | 1   | 1    | 1 | product 1  | 20  | 
| 1 | 5   | 1   | 2    | 2 | product 2  | 40  | 
| 1 | 5   | 1   | 4    | 4 | product 4  | 15  | 
| 2 | 4   | 2   | 2    | 2 | product 2  | 40  | 
| 2 | 4   | 2   | 3    | 3 | product 3  | 30  | 
| 2 | 4   | 2   | 5    | 5 | product 5  | 5  | 
| 3 | 5   | 3   | 1    | 1 | product 1  | 20  | 
| 3 | 5   | 3   | 3    | 3 | product 3  | 30  | 
| 4 | 1   | 4   | 2    | 2 | product 2  | 40  | 
| 4 | 1   | 4   | 4    | 4 | product 4  | 15  | 
| 4 | 1   | 4   | 5    | 5 | product 5  | 5  | 
+ ---- + ----------- + --------- + --------------- + ----+ ------------- + ------ + 

接着,WHERE clasue被施加到返回結果集僅選擇滿足WHERE條件的行:

Where quotes.created_by = 5; 

後這一點,我們得到如下:

+ ---- + ------------+ ----------+ --------------- + ----+ ------------- + ------ + 
| id | created_by | quote_id | new_product_id | id | product_name | price | 
+ ---- + ------------+ ----------+ --------------- + ----+ ------------- + ------ + 
| 1 | 5   | 1   | 1    | 1 | product 1  | 20  | 
| 1 | 5   | 1   | 2    | 2 | product 2  | 40  | 
| 1 | 5   | 1   | 4    | 4 | product 4  | 15  | 
| 3 | 5   | 3   | 1    | 1 | product 1  | 20  | 
| 3 | 5   | 3   | 3    | 3 | product 3  | 30  | 
+ ---- + ----------- + --------- + --------------- + ----+ ------------- + ------ + 

終於查詢calcuates從之和的平均值price專欄:

SELECT SUM(p.price) Total_quoted_value, AVG(p.price) Avg_value 

+ ----------------------- + -------------- + 
| Total_quoted_value  | Avg_value  | 
+ ----------------------- + -------------- + 
| 125      | 25.0000  | 
+ ----------------------- + -------------- + 
+0

太棒了,工作,謝謝。我只是對現在實際發生的事情感到困惑。你能否分解實際發生的事情,請 – mrcurious

+0

出於興趣,是否會通過某種方式在相同的引用中查找平均報價值,而不是將結果除以:從quotes中選擇COUNT('created_by')哪裏'quotes'.'created_by' = 5 – mrcurious

+0

@mrcurious我附加了一個例子如何計算平均價格。我不太清楚「平均報價值」是什麼意思,所以我附上了一個帶有示例數據的小演示的鏈接:http://sqlfiddle.com/#!2/6655be/2,如果這個查詢沒有不適合你的需求,請看這個演示,並顯示(在你的問題 - 通過編輯)這個樣本數據的什麼值,這個查詢不會返回。 – krokodilko

相關問題