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

标签 mysql inner-join

我有 3 个表:quotesquote_itemsproductsquotes 有一个 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/

相关文章:

oracle - 连接到 oracle 表值函数

mysql - 返 repo 买日期在注册日期后 7 天内的所有结果

mysql - 连接多个sql表以查找共同值

mysql - SQL自定义排序

mysql - 根据id从多个表中检索数据

mysql - 将两个表中的列合并为一个结果,然后在 SELECT 查询中使用

mysql - LEFT JOIN 无法替换 NOT EXISTS MYSQL

mysql - 数据库设计的性能: One database for n customers vs a database per customer

mysql - 如何从 MYSQL 中永久删除条目?

mysql - Knex 对只读副本的支持