[英]mysql: group by and get latest record
我有這樣的查詢:
SELECT cus_id, ROUND(SUM(credit_in)-SUM(credit_out), 2) as balance, date_added
FROM `customer_wallet`
GROUP BY cus_id
它將獲得客戶的余額(唯一的客戶)。 如果余額為負,我想修改此值,然后我想要最新日期( date_added
)。
我嘗試這樣做:
SELECT cus_id, ROUND(SUM(credit_in)-SUM(credit_out), 2) as balance, date_added
FROM `customer_wallet`
GROUP BY cus_id
ORDER BY date_added
但是,它會在得到所有結果后給出排序的記錄。 我想要個人客戶的最新記錄。
讓我知道您是否需要更多信息或架構。 謝謝。
我也可以在php
查看余額為負的記錄。 但是,如果我可以在查詢本身中做到這一點,那就太好了。
您需要使用聚合函數來選擇最近的日期-我相信默認值是mysql只為該列選擇一個隨機值。
SELECT cus_id,
ROUND(SUM(credit_in)-SUM(credit_out), 2) as balance,
max(date_added) as most_recent
FROM `customer_wallet`
Having SUM(credit_in) < SUM(credit_out)
GROUP BY cus_id
默認情況下,MYSQL不會強制您將未包含在聚合函數中的所有列都放在Group By
子句中。 這會返回奇怪的結果。
請嘗試以下查詢。
SELECT cus_id,
ROUND(SUM(credit_in)-SUM(credit_out), 2) as balance,
max(date_added) latest_transaction_date
FROM `customer_wallet`
GROUP BY cus_id
HAVING ROUND(SUM(credit_in)-SUM(credit_out), 2) < 0
如果您想了解有關MySQL中Group By
依據的更多信息,可以查看此博客文章: Debunking GROUP BY myths 。 它已經很老了,但是如果您是MySQL的新手,它仍然很有趣。
從您的問題尚不清楚,但是我假設您想要個人的負余額及其最后交易的日期。
SELECT cus_id, ROUND(SUM(credit_in)-SUM(credit_out), 2) as balance, max(date_added) as last_date
FROM `customer_wallet`
HAVING ROUND(SUM(credit_in)-SUM(credit_out) < 0
GROUP BY cus_id
ORDER BY last_date
如果您不只是想要負余額,請使用以下命令:
SELECT cus_id, ROUND(SUM(credit_in)-SUM(credit_out), 2) as balance, max(date_added) as last_date
FROM `customer_wallet`
GROUP BY cus_id
ORDER BY last_date
所以我在這里做一些假設(我也看到了sql標記,所以我希望sql中的答案會有所幫助):
您有一個客戶表:cust_id是主鍵,並且給定的客戶只有一行專用於他們
您有一個帶積分的錢包表。 cust_id是一個外鍵,任何客戶在此表中都可以有多行。 WalletId是此表中的主鍵,並且最近的事務具有最高數量
僅返回cust_id時很難做到這一點。 如果您不反對返回額外的1列,則可以輕松完成此操作(walletid)。 您只需要將導入日期添加到group子句中,並針對walletid使用max函數。
SELECT cus_id, MAX(walletid), ROUND(SUM(credit_in)-SUM(credit_out), 2) as balance, date_added
FROM customer_wallet
GROUP BY IssuerId, date_added
ORDER BY date_added
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.