4

たとえば、これがデータであると仮定しましょう:

ユーザー テーブル:

 ------------------------------
|   user_id     |   username    |
 ------------------------------
| 1             | danny         |
| 2             | george        |
| 3             | lana          |
| 4             | kim           |
| 5             | tim           |
 ------------------------------

users_logins テーブル:

     -----------------------------------------------
    | record_id | user_id   |   recorder            |
     -----------------------------------------------
    | 1         | 3         | 2012-11-06 04:18:26   |
    | 2         | 3         | 2012-11-06 04:31:05   |
    | 3         | 2         | 2012-11-06 03:44:22   |
    | 4         | 1         | 2012-11-06 04:18:58   |
    | 5         | 1         | 2012-11-06 04:30:15   |
    | 6         | 3         | 2012-11-06 04:31:05   |   X
    | 7         | 1         | 2012-11-06 05:53:47   |
    | 8         | 1         | 2012-11-06 05:55:15   |   X
    | 9         | 4         | 2012-11-06 05:59:31   |
    | 10        | 4         | 2012-11-06 06:12:55   |   X
     -----------------------------------------------

最近ログインした 3 人のユーザーを表示したいので、結果には X でマークされた行のみ、つまり最近の一意のログインのみが表示されます。

クエリはどのようになりますか?

4

2 に答える 2

4

オブジェクトへのlinqでこれを試してください

 (from login in users_logins.OrderByDescending(user => user.recorder) 
 from user in users
 where user.user_id == login.user_id
 select user).Distinct().Take(3)

このクエリ
は、1. 最初に日付
で並べ替えます。2. 次に、並べ替えられたログイン データをユーザー データと結合します。3.
次に、個別のユーザーを取得し、
4. 最後に最初の 3 つのレコードを取得します。


以下は代替クエリです

from login in users_logins.OrderByDescending(user =>user.recorder).GroupBy(user=>user.recorder).SelectMany( users=>users.First()).Take(3) 
from user in users
where user.user_id == login.user_id
select user

このクエリは、
1. 最初に並べ替えます
2. 次に user_id でグループ化します
3. 次に、異なるユーザー ID を持つ最初の 3 つのレコードを取得し、
4. 次にユーザー データと結合します。

于 2012-12-27T20:57:40.777 に答える
0

これがあなたの望むものだと思います。

var resentLogedInUsers =
    users
        .Join(
            users_logins,
            u => u.user_id,
            l => l.user_id,
            (u, l) => new
                            {
                                User = u,
                                Login = l.recorder
                            })
        .GroupBy(j => j.User)
        .Select(l => new {User = l.Key, LastLogin = l.Max(d => d.Login)})
        .OrderByDescending(r => r.LastLogin)
        .Take(3);
于 2012-12-27T21:20:43.723 に答える