У меня есть две таблицы MySQL со следующей структурой (я удалил нерелевантные столбцы).
mysql> DESCRIBE `edinners_details`;
+------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+----------------+
| details_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| details_pupil_id | int(11) unsigned | NO | | NULL | |
| details_cost | double unsigned | NO | | NULL | |
+------------------+------------------+------+-----+---------+----------------+
mysql> DESCRIBE `edinners_payments`;
+------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------+------------------+------+-----+---------+----------------+
| payment_id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| payment_pupil_id | int(11) unsigned | NO | | NULL | |
| payment_amount | float unsigned | NO | | NULL | |
+------------------+------------------+------+-----+---------+----------------+
Система работает так, что вы заказываете еду, и каждая еда имеет свою стоимость, каждая изэти заказы хранятся в edinners_details
.Пример строки может быть следующим:
mysql> SELECT * FROM `edinners_details` LIMIT 1;
+------------+------------------+--------------+
| details_id | details_pupil_id | details_cost |
+------------+------------------+--------------+
| 1 | 18343 | 25 |
+------------+------------------+--------------+
Как правило, люди будут платить за эти блюда оптом - если у них есть 40 фунтов стерлингов в течение 20 дней, они будут платить это вконец месяца.Каждый раз, когда они платят, в таблицу edinners_payments
попадает новая строка, примерная строка которой будет выглядеть следующим образом:
mysql> SELECT * FROM `edinners_payments` LIMIT 1;
+------------+------------------+----------------+
| payment_id | payment_pupil_id | payment_amount |
+------------+------------------+----------------+
| 1 | 18343 | 20 |
+------------+------------------+----------------+
Таким образом, из этих двух строк мы можем видеть, что этот человек в настоящее время £ 5в долгу - они поели за £ 25 и заплатили только £ 20.Со временем будет много строк для каждого из пользователей системы, и я могу легко определить, сколько еды у них было, выполнив простой запрос, такой как
SELECT SUM(`details_cost`) AS `meal_total`
FROM `edinners_details`
WHERE `details_pupil_id` = '18343';
Затем, чтобы получитьсумму денег, которую они заплатили, я просто делаю этот запрос:
SELECT SUM(`payment_amount`) AS `payment_total`
FROM `edinners_payments`
WHERE `payment_pupil_id` = '18343';
Моя конечная цель - увидеть, кто должен больше всего денег, но зациклить каждого пользователя моей таблицы users
и запуститьэти два запроса для них, я думаю, это будет довольно медленно, поэтому в идеале я хотел бы объединить два вышеупомянутых запроса в один и, возможно, дополнительный столбец, который будет (meal_total
- payment_total
), который будетдай мне сумму задолженности.Я попробовал несколько способов сделать это, включая объединения и подзапросы, но все они, кажется, повторяют каждую соответствующую строку из edinners_details
для каждой из строк edinners_payments
- так что если было 3 детали и 4 платежа, вы бы вытащили 12 строк, что означает, что выполнение SUM () для столбцов дает мне значение, которое намного превышает то, что должно быть.Хорошим способом продемонстрировать это было бы выполнение этого запроса:
SELECT * FROM (
SELECT `details_cost` AS `cost`
FROM `edinners_details`
WHERE `details_pupil_id` = '18343'
GROUP BY `details_id`
) AS `details`, (
SELECT `payment_amount` AS `amount`
FROM `edinners_payments`
WHERE `payment_pupil_id` = '18343'
GROUP BY `payment_id`
) AS `payment`;
, который дает мне следующий результат:
+------+--------+
| cost | amount |
+------+--------+
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
| 2.5 | 20 |
| 2.5 | 6 |
| 2.5 | 3 |
| 2.5 | 1200 |
+------+--------+
Добавление суммы SUM в это, как таковое:
SELECT SUM(`details`.`cost`) AS `details_cost`, SUM(`payment`.`amount`) AS `payment_total` FROM (
SELECT `details_cost` AS `cost`
FROM `edinners_details`
WHERE `details_pupil_id` = '18343'
GROUP BY `details_id`
) AS `details`, (
SELECT `payment_amount` AS `amount`
FROM `edinners_payments`
WHERE `payment_pupil_id` = '18343'
GROUP BY `payment_id`
) AS `payment`;
Дает мне следующий результат:
+--------------+---------------+
| details_cost | payment_total |
+--------------+---------------+
| 50 | 6145 |
+--------------+---------------+
Если бы это работало, details_cost
было бы 12,5, а payment_total
было бы 1229, но это не так.Вы можете отчетливо видеть повторение в приведенном выше результате. Я прошу прощения, что все затраты составляют 2,5, это делает его немного менее очевидным, но это 5 отдельных заказов на питание с 4 сделанными платежами.Кто-нибудь знает, как я мог бы получить СУММ () стоимости заказа еды и СУММУ () платежей одновременно?
Спасибо