2

ユーザーとログのテーブルが2つあります。ユーザーテーブルをログと結合して、最新のログエントリを取得したいと思います。グループ内の行でグループを使用することはソートされていないことに注意しました。したがって、最新のログ行を取得できません。

ユーザー:

 ID    |   Name
--------------------
  1    |   John    
  2    |   Mike    

ログ:

L_ID | ACTION  | DATE     | USERID
----------------------------------
1    | OPEN    | '1 DEC'  |   1
2    | CLOSE   | '3 DEC'  |   1
3    | WRITE   | '2 DEC'  |   1
4    | OPEN    | '5 DEC'  |   2
5    | CLOSE   | '3 DEC'  |   2

この表を使用して、私が望む結果は次のとおりです。

2 Mike 4 OPEN  '5 DEC'
1 Jhon 2 CLOSE '3 DEC'

グループ内の行が並べ替えられていないため、次のクエリが機能していないことがわかります。

Select * from user join log on ID=USERID group by ID order by DATE DESC,L_ID

また、正しい日付のみが返され、アクションは返されないため、以下は機能しません。

Select ID,Name,Action,Max(Date) from user join log on ID=USERID group by ID order by DATE DESC, L_ID

正しい結果を返すクエリを作成する方法を提案するアイデアはありますか?

4

2 に答える 2

3

あるいは、問題の解決策も見つけましたが、文書化されていない仮定に依存しているため、おそらく私の解決策は「危険」です。group by は、グループの最新の行を参照行として使用することに注意しました。だから私がしたことは、クエリを2つに分割し、group byで参照したい行が最初のクエリの最新のものであることを確認することです:

Select * from (
               Select * from user join log on ID=USERID order by DATE,L_ID
              )
        group by ID order by DATE DESC
于 2012-04-10T16:38:18.277 に答える
0

これは非常に簡単です。

SELECT u.*, l.* 
FROM user AS u 
INNER JOIN log AS l ON l.USERID=u.ID 
WHERE l.DATE = (SELECT max(DATE) FROM log WHERE l.USERID=u.ID ORDER BY L_ID DESC LIMIT 1)

2 Mike 4 OPEN  '5 DEC'
1 Jhon 2 CLOSE '3 DEC'

これはMySQLで機能するはずなので、うまくいけばsqliteも..これは最適化されていない可能性があります。より知識のある人が正確なクエリを提供してくれることを願っています.

これは、日付フィールドが文字列ではなく適切な日時フィールドであると想定しています。これらのリンク から、さらに多くのアイデアが得られるかもしれません。

また、ID による注文は安全ではないことにも注意してください。常に最初のレコード、小さい ID である必要はありません。状況によって異なります。したがって、「時間」または独自のカスタムランクを表す重量などの安全な2番目のソート列を常に用意してください。

于 2012-04-08T11:52:34.480 に答える