запрос, относящийся к четырем таблицам в MySQL - PullRequest
0 голосов
/ 16 февраля 2019

Привет У меня проблема при создании запроса между 4 таблицами в моей базе данных. Сначала я немного объясню структуру моих таблиц и их взаимосвязь:

Марка

+--------------+
| id |  name   |
|--------------|
| 1  |  toyota |
| 2  |  suzuki |
| 3  |  mazda  |
+--------------+

Автомобиль

+------------------------------------+
| id  | brand_id    | model          |
--------------------------------------
| 1   | 1           | XXXXX          |
| 2   | 2           | YYYYY          |
| 3   | 1           | ZZZZZ          |
+------------------------------------+

Аренда

+------------------------------------------------+
| id | car_id | date_init  | date_end   | amount |
--------------------------------------------------
| 1  | 1      | 2019-01-05 | 2019-01-12 |3000    |
| 2  | 2      | 2019-01-22 | 2019-01-30 |1800    |
| 3  | 3      | 2019-02-14 | 2019-01-26 |2500    |
+------------------------------------------------+

Техническое обслуживание

+------------------------------------+
| id  | rental_id   | amount         |
--------------------------------------
| 1   | 3           | 600            |
| 2   | 3           | 320            |
| 3   | 2           | 180            |
+------------------------------------+

По сути, в этих таблицах регистрируется аренда автомобиля в течение определенного времени, это время аренды четко определено.Деталь в том, что во время аренды вы можете выполнить любое или много технического обслуживания автомобиля, поэтому у меня есть таблица технического обслуживания.Из моего запроса мне нужно узнать, сколько денег и сгенерированных моделью автомобиля, включая суммы на техническое обслуживание, я должен получить примерно так:

+-----------------+
| brand   | total |
|-----------------|
| toyota  | 4000  |
| suzuki  | 3800  |
| mazda   | 2700  |
+-----------------+

Мне удалось получить суммы, основываясь только наарендовать, но я не понимаю, как я также могу связать суммы таблицы обслуживания, это то, что у меня есть в моем запросе:

select b.name as brand, sum(r.amount) as Total, m.mnt
from rental r
left join (
  select rental_id, sum(amount) as mnt
  from maintenance 
  group by m.rental_id
) as m on r.id = m.rental_id
inner join car c
on r.car_id = c.id
inner join brand b
on c.brand_id = b.id
group by b.name, m.mnt

с учетом запроса, который я только что опубликовал, этоответ:

+-------------------------+
| brand   | total |  mnt  |
|--------------------------
| toyota  | 3000  | NULL  |
| toyota  | 2500  | 920   |
| suzuki  | 1800  | 180   |
+-------------------------+

ПРИМЕЧАНИЕ: разделяет сумму арендной платы и обслуживания в разных столбцах, чтобы лучше понять проблему, в конце мне нужно добавить один столбец, добавляющийитого как.

1 Ответ

0 голосов
/ 16 февраля 2019

Вам необходимо использовать подзапрос для суммы каждой таблицы.Затем вы можете присоединиться к ним, объединить rental и mnt, а затем сложить это по марке.

SELECT b.name, SUM(r.rental + IFNULL(m.mnt, 0)) AS total
FROM brand AS b
JOIN car AS c on b.id = c.brand_id
JOIN (
  SELECT car_id, SUM(amount) AS rental
  FROM rental
  GROUP BY car_id) AS r ON r.car_id = c.id
LEFT JOIN (
  SELECT r.car_id, SUM(m.amount) AS mnt
  FROM rental AS r
  JOIN maintenance AS m ON m.rental_id = r.id
  GROUP BY rental_id) AS m ON m.car_id = r.car_id
GROUP BY b.id

DEMO

| name   | total |
| ------ | ----- |
| toyota | 6420  |
| suzuki | 1980  |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...