2

みんな。私はここで新しく、SQLについて質問があります。これは、SQLで簡単に実行できると思いますが、アイデアがなく、問題の解決に役立つ可能性があります。

だから私はテーブルを持っています(sqlもここにありますhttp://www.sqlfiddle.com/#!2/b9a37/1/0

各人に複数のオカレンスがあり、自動インクリメントの異なるIDがあり、「Category」、「In」、「Out」の3つのフィールドがあります。

私が実装しようとしているのは、テーブルの一部のユーザーが「In」と「Out」を制限としてシステムに属していることを知る方法です。

  • ユーザーA-カテゴリA-IN2002OUT 2010
  • ユーザーA-カテゴリB-IN2011OUT 9999
  • ユーザーB-カテゴリB-IN2002OUT 2010

上記の例では、2010年に誰がシステムに属しているかを知りたいと思います。

したがって、ユーザーAの場合、彼は2010年にカテゴリーAを離れましたが、2011年のカテゴリー2011に参加したため、2010年にカテゴリーAのユーザーになる必要があります。

ユーザーBの場合、2010以降の新しいエントリがないため、システムに所属するべきではありません。

最後に、2010年の次の出力を取得しようとしています

  • スミスカテゴリーA
  • パブロカテゴリーA

たとえば、希望する結果が得られていません。

SELECT * from users
WHERE (users.In<=2010 and users.Out=2010)

出力

  • スミスカテゴリーA2002年アウト2010年
  • ロジャーカテゴリーB2002年に2010年に
  • ミラーカテゴリーB2008年2010年
  • パブロカテゴリーA2002年アウト2010年

しかし、RogerとMillerは2010年にシステムを離れたため、2010年にはメンバーにならないようにし、SmithとPabloは2010+にカテゴリを変更して、出力に表示する必要があります。

いくつかの注意事項:なぜこのソリューションがこのように開発されているのか私に聞かないでください。私はそれを偶然見つけて、この問題を解決しようとしました。これを解決するためのアイデアが不足しているため、phpで関数を実行して必要な要件に基づいてデータをフィルタリングすることを検討しています。私がここで見たものよりもこれをうまく実装する方法を見つけたら、私のゲストになってください。私は新しいアイデアを受け入れています。

前もって感謝します。

最後の注意:おそらくhttp://www.sqlfiddle.com/#!2/b9a37/1/0を使用して、目的の出力を見つけようとすると役に立ちます。

4

2 に答える 2

1

これを試してみてください:

select Name, Category
from users
where `In` <= 2010 and (
        `Out` > 2010 or name in (
            select name
            from users
            where `In` = 2011
            )
        )

SQLフィドルの例

于 2012-07-24T15:43:21.663 に答える
0

これは機能しているようです。

 select * from users a, users b where a.name = b.name and a.out + 1 = b.out

ただし、複数のユーザーが同じ名前を持っていて、アウトイヤーがインイヤーより1つ少ないと想定している場合は、正しく機能しません。

于 2012-07-24T15:47:51.717 に答える