我有3个表:quotes
,quote_items
和products
。
quotes
有一个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相关的价格并将它们相加?
由于
答案 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;
的链接
------编辑 - 简短说明第二次加入正在做什么--------------
我们有三张桌子:
> 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 |
+ ----------------------- + -------------- +