Попробуйте это:
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 |
+ ----------------------- + -------------- +
Удивительно, что сработало, спасибо. Я просто немного смущен тем, что на самом деле происходит сейчас. Не могли бы вы сломать то, что на самом деле происходит, – mrcurious
из интереса, мог бы каким-то образом найти среднее значение в той же цитате вместо того, чтобы принимать этот результат и делить его на: Выберите COUNT ('created_by') из 'quotes' Где 'quotes'.'created_by' = 5 – mrcurious
@mrcurious Я приложил пример, как рассчитать среднюю цену. Я не совсем уверен, что вы подразумеваете под «средним значением, указанным в кавычках», поэтому я прикрепил ссылку на небольшую демонстрацию с образцами данных: http://sqlfiddle.com/#!2/6655be/2, если этот запрос не работает В соответствии с вашими потребностями, пожалуйста, просмотрите эту демонстрацию и покажите (в своем вопросе - отредактировав ее) какие значения из этих выборочных данных выведут запрос для возврата. – krokodilko