[英]Select data from specific row of grouped and joined table in MySQL
我有兩個表,內部連接的客戶和訂單。 一個客戶可以有多個與之關聯的訂單。 在我的選擇中,我然后按customers.id 分組。 我需要選擇每個客戶的最新訂單,以及在該訂單上花費的金額。 目前,我可以選擇最近的 order_date,但不知道如何選擇與 order_date 同一行的金額。
這是我當前的查詢:
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;
查詢選擇最近的日期,但不選擇與最近的 order_date 關聯的金額。
表聲明:
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)
);
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;
我會在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)
上建立索引。
用這個:
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
如果意圖是返回具有最新 order_date 的所有行,請添加GROUP BY t1.id
如果每個訂單都被orders
一行重新發送,則省略此操作。 請注意,這不會對金額求和。 您必須在代碼中執行此操作,否則使用不同的查詢。 另請注意,此查詢的性能將受到索引配置的影響。 如果 order_date 不是索引的一部分並且表包含大型數據集,則此查詢可能無法執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.