在另一个查询上使用内部联接的结果

时间:2013-08-18 06:58:28

标签: mysql inner-join

我有3个表:quotesquote_itemsproductsquotes有一个created_by字段,对应quote_id中的quote_items字段。 quote_items还有一个字段new_product_id,对应id中的products字段。 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 个答案:

答案 0 :(得分: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                   |
+ ------------- + ------------------- +

第一次加入:

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

其中&lt; &LT; ResultSet_of_the_first_join&gt; &GT;是结果集(第一个连接返回的一组行 - 内存中的一种虚拟表)。

此连接(第二个)生成以下结果集:

+ ---- + ------------+ ----------+ --------------- + ----+ ------------- + ------ +
| 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     |
+ ---- + ----------- + --------- + --------------- + ----+ ------------- + ------ +

最后查询计算price列的总和和平均值:

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

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