表:贷款
Loan_no金额SSS_no贷款期限 7 700.00 0104849222 2010-01-03 8 200.00 0104849222 2010-02-28 9 300.00 0119611199 2010-11-18 10 150.00 3317131410 2012-11-28 11 600.00 0104849222 2011-01-03 14 175.00 3317131410 2012-12-05 15 260.00 3317131410 2013-02-08 16 230.00 0104849222 2013-03-06 17 265.00 0119611199 2011- 04-30 18 455.00 3317131410 2013-03-10
期望的结果:
我想检索每个人获得的的最新贷款他们的SSS号码)。 的结果应如下所示:
Loan_no金额SSS_no借款日期 16 230.00 0104849222 2013-03-06 17 265.00 0119611199 2011-04-30 18 455.00 3317131410 2013-03-10
QUERY#1 USED: b $ b
SELECT * FROM loan GROUP BY SSS_no ORDER BY Loan_date DESC
MYSQL RESULT
Loan_no金额SSS_no贷款期限 10 150.00 3317131410 2012-11-28 9 300.00 0119611199 2010-11-18 7 700.00 0104849222 2010-01-03
QUERY#2 USED:
SELECT Loan_no,Amount,SSS_no,max(Loan_date) FROM loan GROUP BY SSS_no
MYSQL RESULT
Loan_no金额SSS_no贷款_date 7 700.00 0104849222 2013-03-06 9 300.00 0119611199 2011-04-30 10 150.00 3317131410 2013-03-10任何人都可以帮我解决问题吗?感谢。
解决方案MySQL参考资料提出了几种解决方法。最简单的是一个子查询: $ pre code $ SELECT FROM loan l1 WHERE loan_date =(SELECT MAX( l2.loan_date) FROM loan l2 WHERE l1.sss_no = l2.sss_no);
鉴于这种类型的子查询可能性能不佳,他们还建议使用 JOIN Mahmoud Gamal的回答): pre code> SELECT l1.loan_no,l1.amount,l1.sss_no,l1.loan_date FROM贷款l1 JOIN( SELECT loan_no,MAX(loan_date)AS loan_date FROM loan GROUP BY sss_no)AS l2 ON l1.loan_date = l2.loan_date AND l1.sss_no = l2.sss_no;
第三种选择是:
SELECT l1.loan_no,l1.amount,l1.sss_no,l1.loan_date FROM loan l1 LEFT JOIN贷款l2 ON l1.sss_no = l2.sss_no AND l1。 loan_date< l2.loan_date WHERE l2.sss_no IS NULL;LEFT JOIN 的工作原理是当 l1.loan_date 处于最大值时,后面会出现 l2.loan_date ,所以l2行值将会是NULL。
所有这些应该有相同的输出,但可能会有不同的表现。
TABLE: LOAN
Loan_no Amount SSS_no Loan_date 7 700.00 0104849222 2010-01-03 8 200.00 0104849222 2010-02-28 9 300.00 0119611199 2010-11-18 10 150.00 3317131410 2012-11-28 11 600.00 0104849222 2011-01-03 14 175.00 3317131410 2012-12-05 15 260.00 3317131410 2013-02-08 16 230.00 0104849222 2013-03-06 17 265.00 0119611199 2011-04-30 18 455.00 3317131410 2013-03-10
DESIRED RESULTS:
I would want to retrieve the latest loan availed off by each person (identified by their SSS number). The results should be as follows:
Loan_no Amount SSS_no Loan_date 16 230.00 0104849222 2013-03-06 17 265.00 0119611199 2011-04-30 18 455.00 3317131410 2013-03-10
QUERY # 1 USED:
SELECT * FROM loan GROUP BY SSS_no ORDER BY Loan_date DESC
MYSQL RESULT
Loan_no Amount SSS_no Loan_date 10 150.00 3317131410 2012-11-28 9 300.00 0119611199 2010-11-18 7 700.00 0104849222 2010-01-03
QUERY # 2 USED:
SELECT Loan_no, Amount, SSS_no, max(Loan_date) FROM loan GROUP BY SSS_no
MYSQL RESULT
Loan_no Amount SSS_no Loan_date 7 700.00 0104849222 2013-03-06 9 300.00 0119611199 2011-04-30 10 150.00 3317131410 2013-03-10Can anybody help me with my problem? Thanks.
解决方案The MySQL reference suggests several ways to solve this. The simplest is a subquery:
SELECT * FROM loan l1 WHERE loan_date=(SELECT MAX(l2.loan_date) FROM loan l2 WHERE l1.sss_no = l2.sss_no);Given that this type of subqueries potentially have bad performance, they also suggest using a JOIN (essentially Mahmoud Gamal's answer):
SELECT l1.loan_no, l1.amount, l1.sss_no, l1.loan_date FROM loan l1 JOIN ( SELECT loan_no, MAX(loan_date) AS loan_date FROM loan GROUP BY sss_no) AS l2 ON l1.loan_date = l2.loan_date AND l1.sss_no = l2.sss_no;A third option is:
SELECT l1.loan_no, l1.amount, l1.sss_no, l1.loan_date FROM loan l1 LEFT JOIN loan l2 ON l1.sss_no = l2.sss_no AND l1.loan_date < l2.loan_date WHERE l2.sss_no IS NULL;The LEFT JOIN works on the basis that when l1.loan_date is at its maximum value, there is later l2.loan_date, so the l2 row values will be NULL.
All these should have the same output, but likely differ in performance.
更多推荐
MySQL groupwise MAX()返回意外的结果
发布评论