Mysql
如何根據 MySQL 中的欄位選擇最近的條目
我的表有多個個人客戶的條目,這些客戶多年來從
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'
可能會修改此查詢以獲得更好的性能,但為此我需要查看您的數據庫結構。