Mysql

如何根據 MySQL 中的欄位選擇最近的條目

  • February 24, 2022

我的表有多個個人客戶的條目,這些客戶多年來從suppliers我數據庫中列出的幾個中的任何一個進行了多次購買。我需要執行查詢以選擇最近從供應商“A”購買的產品。如果客戶supplier上個月從“A”購買,但他們最近一次購買是昨天從supplier“B”購買的,那麼我不希望他們包含在結果中。這可能是一個簡單的查詢,但我無法理解執行此查詢的可靠方法。

基本上,我想要生成的是:

SELECT 
`customer_email`,
`supplier`,
`purchase_date`
from `customer_table`
WHERE
`supplier` = 'A' and

…““customer_email”的此次購買是“customer_email”的最近一次購買,即使他們之前曾多次從多個“供應商”中購買過。

任何幫助指出我完成此查詢的正確方向將不勝感激!

使該查詢更簡單的一種方法是在設計表本身的過程中集成此要求。購買表可以是一個只能追加的表(刪除不會有任何區別,但購買不能是可編輯的),主鍵(id)是一個自動增量列。這樣做時,id 列與purchase_date列成正比。

可以通過以下方式獲得所需的結果集:

select *
from customer_purchases cp
where cp.id = (
 select max(id)
 from customer_purchases cp_inner
 where cp_inner.customer_email= cp.customer_email 
) and cp.supplier = "supplier_one";

如果有人發現這種方法有任何缺點,請告訴我。

db-fiddle 連結:db-fiddle

WITH CTE AS (
SELECT customer_email,
   supplier,
   purchase_date,
   ROW_NUMBER() OVER (PARTITION BY customer_email ORDER BY purchase_date DESC) AS rn
from customer_table
)
SELECT customer_email,
   supplier,
   purchase_date
FROM CTE 
WHERE supplier = 'A' AND rn = 1

對於早於 8 的 MySQL 版本,您可以使用此查詢:

SELECT customer_email,
   supplier,
   (SELECT MAX(purchase_date) FROM customer_table WHERE customer_email = t.customer_email) AS purchase_date
FROM (
   SELECT c.customer_email,
       (SELECT supplier FROM customer_table WHERE customer_email = c.customer_email ORDER BY purchase_date DESC LIMIT 1) AS supplier
   FROM (SELECT DISTINCT customer_email
           FROM customer_table) AS c
   ) AS t
WHERE supplier = 'A'

可能會修改此查詢以獲得更好的性能,但為此我需要查看您的數據庫結構。

引用自:https://dba.stackexchange.com/questions/265177