0

次のような人へのステータス変更の履歴を保存するテーブルがあります。

id | username | date | status

日付フィールドは、ステータスが更新された日時であり、ステータス フィールドには、その日付以降の新しいステータスが含まれます。

したがって、テーブルの日付は次のようになります。

1 | セラフェイム | 2012-03-03 | "新着"
2 | ジョン | 2012-03-05 | "新着"
3 | セラフェイム | 2012-03-13 | "保留中"
4 | セラフェイム | 2012-03-15 | "年"
5 | ジョン | 2012-03-05 | "保留中"

などなど

ここで、過去の特定の日付について、各ユーザーがその時点で持っていたステータスを取得するクエリが必要です。たとえば、2012-04-14 の場合、次の結果を取得したいと思います

セラフェイム | "保留中"
ジョン | "新着"

2012-03-04 の場合、取得する必要があります

セラフェイム | "新着"

それを行うSQLクエリを考えられる人はいますか? 私はこれをプログラムで行いたくありません! 私はmysqlを使用していますが、それが私の問題に関連しているとは思いません...

前もって感謝します

4

3 に答える 3

3

次のクエリは、指定された日付より前の、指定されたユーザー名の最新のレコードを識別し、履歴テーブルをその最新のレコードIDと結合して、残りの詳細をフェッチします。

SELECT a.* 
FROM 
   history a
   JOIN (SELECT username, MAX(id) 'id' FROM history 
         WHERE date < @inputDate
         GROUP BY username
        ) as b
   ON a.id = b.id
于 2012-10-26T09:16:57.880 に答える
1

入力日付以下の日付を持つユーザーの最初のレコードを取得します。

declare @userid nvarchar(128)
declare @date datetime

SELECT userid, status
FROM
(
  SELECT limit 1 * FROM mytable
  WHERE date <= @date
    AND userid = @userid
  ORDER by date desc
)

未テスト!構文エラーがあれば申し訳ありません。

于 2012-10-26T09:22:28.627 に答える
1

現在、MySql データベースでテストすることはできませんが、このクエリはうまくいくはずです。

table2クエリは、目的の日付より前にすべてのユーザー名のイベントを登録した最大日付を取得します。これは、その人の最後のステータス イベントである必要があります。

結合はステータスを取得します。

select username, status from table
join
(
select username, max(date) as maxdate from table
where date <= '2012-04-14'
group by username ) table2
on table.username = table2.username and table.date = table.2maxdate

別の方法は、参加せずに行うことができます

select username, status from table
where date = (select max(date) as maxdate from table
where date <= '2012-04-14'
group by username )
于 2012-10-26T09:23:03.213 に答える