簡體   English   中英

從 MySQL 中分組和連接表的特定行中選擇數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM