выберите запрос, используя вложенные запросы в MySQL

0

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

Я застрял, как это сделать?

  • 0
    Если я форматирую ваш запрос для наглядности, не откатывайте его.
  • 0
    Какая версия MySQL это?
Теги:

3 ответа

0

Чтобы получить следующие результаты, вы можете написать запрос с объединением, как показано ниже:

Выход:-

    +------+------------+
    | 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;
  • 0
    Если они имеют миллионы результатов, вероятно, лучше выполнить WHERE cust.visited >= DATE_SUB(CURDATE(),INTERVAL 8 MONTH) до того, как JOIN или время загрузки будет болезненным
  • 1
    да, это может быть добавлено в условии соединения, как, например, выберите d.name, d.details, sum (cust.amount) из деталей d присоединитесь к клиенту cust.name = d.name и cust.visited> = DATE_SUB (CURDATE ( ), ИНТЕРВАЛ 8 МЕСЯЦЕВ) сгруппировать по порядку имен d.name по сумме (cust.amount) предел 1; Позвольте мне отредактировать мой ответ :)
0
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
  • 0
    Вы можете просто использовать USING name для JOIN?
  • 0
    Да, конечно, вы могли бы.
Показать ещё 1 комментарий
0

Вам необходимо 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

Обратите внимание, что я удалил ваш подзапрос, поскольку он был лишним.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню