У меня есть 2 таблицы (например, клиент и детали), содержащие следующие данные. Мне нужно распечатать сведения о людях, которые вложили максимальную сумму.
Покупатель:
+------+------------+--------+
| name | visited | amount |
+------+------------+--------+
| xyz | 2018-04-11 | 100 |
| xyz | 2018-04-11 | 1000 |
| abc | 2018-02-21 | 500 |
| xyz | 2018-03-11 | 700 |
| abc | 2018-01-24 | 50 |
+------+------------+--------+
Подробности:
+------+------------+
| name | detail |
+------+------------+
| abc | california |
| xyz | hongkong |
+------+------------+
Я нашел клиента, который вложил максимальную сумму, используя запрос
select name,sum(amount)
from (
select name,amount
from customer
where visited >= DATE_SUB(CURDATE(),INTERVAL 8 MONTH)
) as subtable
group by name
order by amount
limit 1;
У меня есть следующий вывод
+------+-------------+
| name | sum(amount) |
+------+-------------+
| xyz | 1800 |
+------+-------------+
теперь, как я могу найти детали xyz из таблицы деталей? Мне нужно сделать все это в одном запросе. Мой выход должен быть похож.
+------+------------+
| name | detail |
+------+------------+
| xyz | hongkong |
+------+------------+
Я застрял, как это сделать?
Чтобы получить следующие результаты, вы можете написать запрос с объединением, как показано ниже:
Выход:-
+------+------------+
| name | detail |
+------+------------+
| xyz | hongkong |
+------+------------+
Запрос: -
select d.name, d.details
from details d
join customer cust on cust.name = d.name and
cust.visited >= DATE_SUB(CURDATE(),INTERVAL 8 MONTH)
group by d.name
order by sum(cust.amount) desc
limit 1;
Если вы хотите распечатать сумму Сумма вместе с этим, вам нужно просто добавить еще один столбец в свой оператор select:
Выход:-
+------+------------+--------------+
| name | detail | sum(amount) |
+------+------------+--------------+
| xyz | hongkong | 1800 |
+------+------------+--------------+
Запрос: -
select d.name, d.details, sum(cust.amount)
from details d
join customer cust on cust.name = d.name and
cust.visited >= DATE_SUB(CURDATE(),INTERVAL 8 MONTH)
group by d.name
order by sum(cust.amount) desc
limit 1;
WHERE cust.visited >= DATE_SUB(CURDATE(),INTERVAL 8 MONTH)
до того, как JOIN
или время загрузки будет болезненным
select d.name, d.details, sum(c.amount)
from details d
join customer c on c.name = d.name
where c.visited >= DATE_SUB(CURDATE(),INTERVAL 8 MONTH)
group by d.name
order by sum(c.amount) desc
limit 1
USING name
для JOIN?
Вам необходимо JOIN
к таблице подробностей. Я решил использовать подзапрос, чтобы ограничить количество поисковых строк для операции соединения.
select c.name, d.detail
from (
select
name,
sum(amount) as sum_amount
from customer
where visited >= DATE_SUB(CURDATE(),INTERVAL 8 MONTH)
group by name
order by sum_amount
limit 1
) c
left join details d on c.name = d.name
Обратите внимание, что я удалил ваш подзапрос, поскольку он был лишним.