1

問題は次のようになります。

クラスを持つテーブルがあり、それぞれに start_time と end_time (INT - 分として保存されます。たとえば、120 - 2:00、130 - 2:10) があります。ユーザー クラスによって選択されたものを取得し、残りをフィルタリングする必要があります。選択したクラスと衝突しないクラスを取得します。誰でもこれを手伝ってもらえますか? 多分いくつかの手がかり?

サンプル行:

id start end
1   0    100
2   50   150
3   160  200
4   50   150
5   50   100
6   200  300

id=1 を選択した場合、行 3,6 を返す必要があります (2,4,5 で 50 から 100 までをカバーするため、両方のクラスに参加することはできません)。

id=2,6 を選択した場合、行 3 を返す必要があります

id=2 を選択した場合、行 3,6 を返す必要があります

id=6 を選択した場合、行 1,2,3,4,5 を返す必要があります

id=3 を選択した場合、行 1,2 を返す必要があります

4

2 に答える 2

3

あなたが述べたように1つのテーブルを想定する以外にほとんど何も基づいていないため、自己結合が必要になります。

SELECT rest.*
FROM classes AS chosen
RIGHT JOIN classes AS rest
    ON rest.start_time NOT BETWEEN chosen.start_time AND chosen.end_time
    AND rest.end_time NOT BETWEEN chosen.start_time AND chosen.end_time
WHERE chosen.ClassID = '4'

選択したクラスには「chosen」、残りのクラスリストには「rest」としてテーブルにエイリアスを付けました。これにより、WHERE 句で指定した選択したクラスと重複しないすべての「残り」のクラスが返されます。

于 2013-05-31T21:35:06.533 に答える
3

これにより、指定された 1 つの ID に対して重複する ID が得られます。

select id from classes c
inner join classes noc on noc.id = <given id>
where c.start > noc.end or c.end < noc.start
;

編集:

拡張された例を理解している限り、ID の任意のサブセットを入力として指定し、それらのいずれとも重複しないすべての ID を取得する必要があります。やってみよう:

select c.* 
from classes c 
left join classes noc on noc.id in (<idlist>) 
     and noc.start < c.end 
     and noc.end > c.start 
where noc.id is null;

「<」と「>」は、「重複」の意味によっては「<=」と「>=」の場合があります。

あなたはサブクラスを探しているようには聞こえませんが、set-djungle を通り抜けられると思います。;-)

あなたの例「選択されたid = 3」は、3が誰とも重複しないため、1,2,4,5,6を私に与えます。

説明:

  • クラスを通過する
  • 指定されたクラスと重複するクラスを探します
  • そして、重複するクラスが見つからないクラスだけを表示してください。

noc「許可されていないクラス」の略です。そのクラスが見つかった場合、指定されたセットに重複が存在します。

于 2013-05-31T21:43:18.560 に答える