从两个表中选择一行的最大值

时间:2014-07-12 16:22:17

标签: mysql sql

请我尝试使用两个表中的最大值查询数据

table1
|user_id | name |
| 001    | Paul |
| 002    | Sean |


table2
|id  | class | Year | user_id |
|201 |  1A   | 2010 |  001    |
|202 |  2A   | 2011 |  001    |
|203 |  1B   | 2010 |  002    |

user_id中的table2引用user_id

中的table1

这就是我想要输出的方式

OUTPUT
 | user_id | name | class| year |
 | 001     | Paul | 2A   | 2011 |
 | 002     | Sean | 1B   | 2010 |

TRIED SO FAR

SELECT 
       a.user_id,
       a.name,
       b.class,
       max(Year) as year
FROM
       table1 a
INNER JOIN
           table2 b
    ON
           a.user_id=b.user_id

GROUP BY user_id

上面的这个查询给了我一个最大年份,它连续有一个不同的类值,因此是前一个类值。这就是它的样子

 | user_id | name | class| year |
 | 001     | Paul | 1A   | 2011 |
 | 002     | Sean | 1B   | 2010 |

我的查询中哪里出错了?任何帮助表示赞赏。感谢

3 个答案:

答案 0 :(得分:1)

也许您可以先按年订购完整的结果集,然后按用户ID分组:

SELECT * FROM (

SELECT 
       a.user_id,
       a.name,
       b.class,
       year
FROM
       table1 a
INNER JOIN
           table2 b
    ON
           a.user_id=b.user_id
ORDER BY year desc

) h
GROUP BY user_id

SqlFiddle demo here

答案 1 :(得分:0)

由于您已使用group by,因此可以使用substring_index() / group_concat()黑客:

SELECT a.user_id, a.name,
       substring_index(group_concat(b.class order by year desc), ',', 1) as maxclass
       max(Year) as year
FROM table1 a INNER JOIN
     table2 b
     ON a.user_id=b.user_id
GROUP BY a.user_id, a.name;

您也可以使用group by

在没有not exists的情况下执行此操作
SELECT a.user_id, a.name, b.class, b.year
FROM table1 a INNER JOIN
     table2 b
     ON a.user_id=b.user_id
WHERE NOT EXISTS (select 1 from table2 b2 where b2.user_id = b.user_id and b2.year > b.year)

where子句重新描述查询。它说:“从table2获取同一用户没有更大year的所有行。”这相当于获取具有最大年份的行。而且,这是标准的SQL,它在任何数据库中都能很好地工作。

答案 2 :(得分:0)

尝试使用子查询

SELECT 
       a.user_id,
       a.name,
       (Select class  FROM table2 where year = max(b.year)) as class,
       max(b.Year) as year
FROM
       table1 a,table2 b
WHERE
      a.user_id=b.user_id