Mysql中MAX()函数使用的时候注意事项(MIN()同理)

①MAX函数单独使用注意事项

条件:根据身份证号(CERT_NO) 和险种id(PRODUCT_ID)查询最大业务月份(NAT_MON)及其对应的信息(一个身份证号,一种险种,只有一个最大的业务月份于之对应)

      1>错误写法

SELECT
M.SINS_DET_ID AS id,
M.EXECUTE_AREA_ID,
E.EMP_NAME,
E.UNIQ_NO,
E.CERT_TYPE,
M.CUST_ID,
M.BUSI_CUST_NAME custName,
M.RECEIVE_SUPP_ID,
M.RECEIVE_SUPP_NAME,
M.BUSI_CUST_ID,
M.ORDER_ID,
MAX(M.NAT_MON) natMon,
E.CERT_NO
FROM
SINS_MONTHLY_DET M
JOIN SINS_EMP_INFO E ON M.SINS_EMP_ID = E.SINS_EMP_ID
WHERE
1 = 1
AND E.IS_EFFECT = 1
AND M.IS_EFFECT = 1
AND E.CERT_NO = '510626199001014533'
AND M.PRODUCT_ID = 3

错误原因:虽然业务月份是最大的,但是但是与之匹配的信息却不是真实的信息(不是根据条件查询的对应的最大的业务月份对应给的信息),而是根据条件查询出来数据库表中的的第一条记录的基本信息。

SELECT
M.SINS_DET_ID AS id,
M.EXECUTE_AREA_ID,
E.EMP_NAME,
E.UNIQ_NO,
E.CERT_TYPE,
M.CUST_ID,
M.BUSI_CUST_NAME custName,
M.RECEIVE_SUPP_ID,
M.RECEIVE_SUPP_NAME,
M.BUSI_CUST_ID,
M.ORDER_ID,
M.NAT_MON natMon,
E.CERT_NO
FROM
SINS_MONTHLY_DET M
JOIN SINS_EMP_INFO E ON M.SINS_EMP_ID = E.SINS_EMP_ID
WHERE
1 = 1
AND E.IS_EFFECT = 1
AND M.IS_EFFECT = 1
AND E.CERT_NO = '510626199001014533'
AND M.PRODUCT_ID = 3
AND M.NAT_MON = (
SELECT
MAX(NAT_MON) NAT_MON
FROM
SINS_MONTHLY_DET M
JOIN SINS_EMP_INFO E ON M.SINS_EMP_ID = E.SINS_EMP_ID
WHERE
E.IS_EFFECT = 1
AND M.IS_EFFECT = 1
AND E.CERT_NO = '510626199001014533'
AND M.PRODUCT_ID = 3
)

②MySQL中MAX函数与Group By一起使用的注意事项

转载 2015年01月15日 16:26:51
  • 11355

http://blog.csdn.net/magicharvey/article/details/21372813

  1. mysql> select * from test;  
  2. +----+-------+------+-------+  
  3. | id | name  | age  | class |  
  4. +----+-------+------+-------+  
  5. |  1 | qiu   |   22 |     1 |   
  6. |  2 | liu   |   42 |     1 |   
  7. |  4 | zheng |   20 |     2 |   
  8. |  3 | qian  |   20 |     2 |   
  9. |  0 | wang  |   11 |     3 |   
  10. |  6 | li    |   33 |     3 |   
  11. +----+-------+------+-------+  
  12. rows in set (0.00 sec)  

如果想找到每个class里面的最大的age,则需要使用group by和max。

如下的sql语句,则输出结果有错误:

[sql] view plaincopy
  1. mysql> select id,name,max(age),class from test group by class;  
  2. +----+-------+----------+-------+  
  3. | id | name  | max(age) | class |  
  4. +----+-------+----------+-------+  
  5. |  1 | qiu   |       42 |     1 |   
  6. |  4 | zheng |       20 |     2 |   
  7. |  0 | wang  |       33 |     3 |   
  8. +----+-------+----------+-------+  
  9. rows in set (0.00 sec)  
虽然找到的age是最大的age,但是与之匹配的用户信息却不是真实的信息,而是group by分组后的第一条记录的基本信息。

如果我使用以下的语句进行查找,则可以返回真实的结果。

[sql] view plaincopy
  1. mysql> select * from (  
  2.     -> select * from test order by age descas b  
  3.     -> group by class;  
  4. +----+-------+------+-------+  
  5. | id | name  | age  | class |  
  6. +----+-------+------+-------+  
  7. |  2 | liu   |   42 |     1 |   
  8. |  4 | zheng |   20 |     2 |   
  9. |  6 | li    |   33 |     3 |   
  10. +----+-------+------+-------+  
  11. rows in set (0.00 sec)  

方法2:

    

  1. select * from test t where t.age = (select max(age) from test where t.class = class) order by class;  


你可能感兴趣的:(Mysql中MAX()函数使用的时候注意事项(MIN()同理))