指定したカラム毎で最新のリストが欲しい(SQL, SELECT文)


SQL文を教えて下さい。  
user_id 毎の最新の bills 一覧を得る SELECT 文はどう書けば良いのでしょうか？

## テーブル定義

[code]

    mysql> desc bills;
    +---------------------+--------------+------+-----+---------+----------------+
    | Field               | Type         | Null | Key | Default | Extra          |
    +---------------------+--------------+------+-----+---------+----------------+
    | id                  | int(11)      | NO   | PRI | NULL    | auto_increment |
    | user_id             | int(11)      | YES  | MUL | NULL    |                |
    | created_at          | datetime     | YES  |     | NULL    |                |
    +---------------------+--------------+------+-----+---------+----------------+
    
[/code]

## サンプル

[code]

    +----+---------+------------+
    | id | user_id | created_at |
    +----+---------+------------+
    |  1 |     111 | 2015-01-01 |
    +----+---------+------------+
    |  2 |     111 | 2015-01-02 |
    +----+---------+------------+
    |  3 |     111 | 2015-01-03 | ← 111 の中で最新の日付
    +----+---------+------------+
    |  4 |     222 | 2015-01-02 | ← 222 の中で最新の日付
    +----+---------+------------+
    |  5 |     222 | 2015-01-01 |
    +----+---------+------------+
    
[/code]

## 期待する結果

[code]

    +----+---------+------------+
    | id | user_id | created_at |
    +----+---------+------------+
    |  3 |     111 | 2015-01-03 |
    +----+---------+------------+
    |  4 |     222 | 2015-01-02 |
    +----+---------+------------+
    
[/code]




既に回答は出されていますが、別の方法でやってみます。

[code]

    SELECT * FROM bills AS b WHERE created_at = (
      SELECT MAX(created_at) FROM bills AS bs WHERE b.user_id = bs.user_id
    );
    
[/code]

この場合も最大値を持つレコードが複数ある場合は全て選択されることになります。

**追記**

最大値を持つレコードが複数ある場合に、例えば `id` が最も大きいレコードを抽出するには以下の様にします。

[code]

    SELECT * FROM bills AS b WHERE id = (
      SELECT MAX(id) FROM bills AS bs
      WHERE b.user_id = bs.user_id AND
            created_at = (
              SELECT MAX(created_at) FROM bills AS bs
              WHERE b.user_id = bs.user_id)) ORDER BY user_id;
    
[/code]

最小値の `id` を持つレコードを抽出する場合は、上記の `MAX(id)` を `MIN(id)` に変更します。

