Выберите данные из указанной c строки сгруппированной и объединенной таблицы в MySQL - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть две таблицы, клиенты и заказы, которые соединены внутри. С клиентом может быть связано несколько заказов. В моем выборе я затем группируюсь по customer.id. Мне нужно выбрать самый последний заказ каждого клиента, а также сумму денег, потраченную на этот заказ. В настоящее время я могу выбрать самую последнюю дату заказа, но не знаю, как выбрать сумму в той же строке, что и дата заказа.

Это мой текущий запрос:

SELECT 
    first_name, 
    last_name, 
    email, 
    MAX(order_date) AS recent_order, 
    amount -- this needs to select amount associated with recent_order
FROM customers
JOIN orders
    ON customers.id = orders.customer_id
GROUP BY customers.id;

Запрос выбирает самая последняя дата, но не выбирается сумма, связанная с самой последней датой заказа.

Объявления таблицы:

CREATE TABLE customers (
    id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(100),
    last_name VARCHAR(100),
    email VARCHAR(100)
);

CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_date DATE,
    amount DECIMAL(8,2),
    customer_id INT,
    FOREIGN KEY(customer_id) REFERENCES customers(id)
);

Ответы [ 3 ]

1 голос
/ 15 февраля 2020

Я бы порекомендовал коррелированный подзапрос в предложении where:

SELECT c.*, o.*  -- or whatever columns you want
FROM customers c JOIN
     orders o
     ON c.id = o.customer_id
WHERE o.order_date = (SELECT max(o2.order_date)
                      FROM orders o2
                      WHERE o2.customer_id = o.customer_id
                     );

Для производительности вам нужен индекс на orders(customer_id, order_date).

1 голос
/ 15 февраля 2020
SELECT 
    first_name, 
    last_name, 
    email, 
    MAX(order_date) AS recent_order, 
    (SELECT amount FROM orders WHERE order_date = MAX(order_date) AND customers.id = orders.customer_id) as amount
FROM customers
JOIN orders
    ON customers.id = orders.customer_id
GROUP BY customers.id;

ИЛИ

SELECT 
    first_name, 
    last_name, 
    email, 
    order_date AS recent_order, 
    amount AS recent_order_amount
FROM customers
JOIN orders
    ON customers.id = orders.customer_id

GROUP BY customers.id
ORDER BY orders.order_date DESC;
0 голосов
/ 15 февраля 2020

Используйте это:

SELECT TOP 1
    t1.first_name, 
    t1.last_name, 
    t1.email, 
    t2.order_date,
    t2.amount
FROM customers t1
JOIN orders t2
    ON t1.id = t2.customer_id
ORDER BY
    t2.order_date

Добавьте GROUP BY t1.id, если необходимо вернуть все строки с самой последней датой order_date. Опустите это, если каждый ордер представлен одной строкой в ​​orders. Обратите внимание, что это не будет суммой сумм. Вам придется сделать это в коде или использовать другой запрос. Также обратите внимание, что на производительность этого запроса будет влиять конфигурация индексов. Этот запрос может не выполняться, если order_date не является частью индекса и таблица содержит большой набор данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...