0

我希望答案很简单,我很傻。

所以我有两张桌子:(day带 PK id_day)和hour(带 PK id_hour)。

我有另一个表tilt_time,它有id_day,id_hour字段和一个加 FK 字段(有禁止时间)。例如tilt_time具有以下行(id_day, id_hour, id_target):

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

In tableday id_day介于 1 和 5 之间(周一至周五)并且hour id_hour介于 1 和 6 之间(因此您可以想象一个day_hour具有 5*6=30 值的表)。

所以我想要查询id_target=1的空闲时间和id_target=2空闲时间(每个人的空闲时间)。所以我想要类似的:

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

如果你有一张target包含 all 的表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

以下查询返回id_dayid_hour其中 1 和 2 的目标 id 都没有记录tilt_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 回答