我有 3 个表:quotes
、quote_items
和 products
。
quotes
有一个 created_by
字段,它对应于 quote_items
中的 quote_id
字段。
quote_items
还有一个字段 new_product_id
对应于 products
中的 id
字段。
products
还有一个 price
字段。
我正在尝试运行一个查询,以获取特定 created_by
值的 Total quoted value
。
到目前为止我所拥有的是:
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 相关的价格并将它们相加?
谢谢
最佳答案
试试这个:
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
其中 << 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 子句应用于返回的结果集以仅选择满足 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 |
+ ----------------------- + -------------- +
关于mysql - 在另一个查询上使用内部联接的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18296536/