0

答えが単純で、私がばかであることを願っています。

dayしたがって、 (with PK id_day) とhour(with PK )の 2 つのテーブルがありid_hourます。

、フィールド、プラス FK フィールド (禁止されている時間) をtilt_time持つ別のテーブルがあります。たとえば、次の行 ( 、、) があります。id_dayid_hourtilt_timeid_dayid_hourid_target

1,1,1
1,2,1
1,3,1
1,1,2
1,2,2

In tableday id_dayは 1 から 5 (月曜日から金曜日)の間で、1 から 6 の間です (したがって、5*6=30 の値を持つテーブルをhour id_hour想像できます)。day_hour

そこで、 queryid_target=1の無料期間とid_target=2の無料期間 (everbody の無料期間) が必要です。だから私は似たようなものをしたい:

1,4,1
1,5,1
1,6,1
2,*,1
3,*,1
4,*,1
5,*,1
// id_target=2
1,3,2
1,4,2
1,5,2
1,6,2
2,*,2
3,*,2
4,*,2
5,*,2

(* はすべての有効なid_hour値を意味するため、* を含むすべての行は 6 つの異なる行を表します)

このクエリを実行するにはどうすればよいですか?

4

2 に答える 2

0

targetall を含むテーブルがある場合id_target、答えは簡単です。

SELECT 
    d.id_day, h.id_hour, t.id_target
FROM 
    day AS d
  CROSS JOIN
    hour AS h
  CROSS JOIN
    target AS t
WHERE
    (d.id_day, h.id_hour, t.id_target) NOT IN
      ( SELECT id_day, id_hour, id_target
        FROM tilt_time
      )
;

または(おそらくより効率的です):

SELECT 
    d.id_day, h.id_hour, t.id_target
FROM 
    day AS d
  CROSS JOIN
    hour AS h
  CROSS JOIN
    target AS t
  LEFT JOIN
    tilt_time AS tt
      ON  tt.id         = d.id_day
      AND tt.id_hour    = h.id_hour
      AND t.t.id_target = t.id_target
WHERE 
    tt.id_target iS NULL ;

テーブルがない場合は、上記のコードの を次のようにtarget置き換えます。target AS t

( SELECT DISTINCT id_target FROM tilt_time ) AS t
于 2012-07-29T13:14:43.787 に答える
0

次のクエリは、1 と 2 の両方のターゲット ID が にレコードを持たない と をid_day返します。id_hourtilt_time

SELECT tg1_free.id_day, tg2_free.id_hour
FROM (
    SELECT
        day.id_day, hour.id_hour
    FROM day, hour
    WHERE
        (day.id_day, hour.id_hour) NOT IN (SELECT id_day, id_hour FROM tilt_time WHERE id_target = 1)
) tg1_free
INNER JOIN (
    SELECT
        day.id_day, hour.id_hour
    FROM day, hour
    WHERE
        (day.id_day, hour.id_hour) NOT IN (SELECT id_day, id_hour FROM tilt_time WHERE id_target = 2)
) tg2_free ON (tg1_free.id_day = tg2_free.id_day AND tg1_free.id_hour = tg2_free.id_hour)

[編集]

すべてのターゲット ID について (さらに簡単です):

SELECT id_day, id_hour
FROM day, hour
WHERE
    (day.id_day, hour.id_hour) NOT IN (SELECT id_day, id_hour FROM tilt_time);
于 2012-07-29T13:17:57.590 に答える