2013-08-18 3 views
1

У меня есть 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 

Это возвращает все идентификаторы продуктов всех цитат, созданных кем-то с идентификатором 5. Как запустить последнюю часть запроса этого результата, т.е. , получить цены, связанные с каждым идентификатором продукта и суммировать их?

Благодаря

ответ

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 



----- EDIT ---------- Пример как рассчитать среднюю цену

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; 

A Ссылка на sqlfiddle demo



------ EDIT - краткое объяснение того, что второй присоединиться делает --------------

У нас есть три таблицы:

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

Th е первый присоединиться:

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>> является ResultSet (набор строк, возвращаемый первым присоединиться - вид виртуальной таблицы в памяти).

Это присоединиться (второй) производит следующий набор результатов:

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

Далее, ГДЕ clasue применяется к возвращаемому результирующему, чтобы выбрать только те строки, которые удовлетворяют, где условия:

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 column:

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

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

Удивительно, что сработало, спасибо. Я просто немного смущен тем, что на самом деле происходит сейчас. Не могли бы вы сломать то, что на самом деле происходит, – mrcurious

+0

из интереса, мог бы каким-то образом найти среднее значение в той же цитате вместо того, чтобы принимать этот результат и делить его на: Выберите COUNT ('created_by') из 'quotes' Где 'quotes'.'created_by' = 5 – mrcurious

+0

@mrcurious Я приложил пример, как рассчитать среднюю цену. Я не совсем уверен, что вы подразумеваете под «средним значением, указанным в кавычках», поэтому я прикрепил ссылку на небольшую демонстрацию с образцами данных: http://sqlfiddle.com/#!2/6655be/2, если этот запрос не работает В соответствии с вашими потребностями, пожалуйста, просмотрите эту демонстрацию и покажите (в своем вопросе - отредактировав ее) какие значения из этих выборочных данных выведут запрос для возврата. – krokodilko