- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在一家为客户出租飞机模拟器类(class)的公司工作。在进入模拟器之前,飞行员(客户)必须为他将驾驶的模拟器做好有效的编码。有效编队是飞行员成功通过且未过期的编队(因此我们必须存储获取日期和过期日期)。
实体:
关系:
复制粘贴此代码到 http://mocodo.wingi.net/ 以直观地看到它:
DATE: _acquisition_date, _expiration_date
PILOT: id, first_name, last_name
is Trained For, 0n PILOT, 0n SIMULATOR, 0n DATE
SIMULATOR: id, name
不要忘记单击上方的“刷新”图标来查看结果
PILOT([id]、名字、姓氏、...)
接受培训([pilot_id、simulator_id、acquisition_date、expiration_date])
模拟器([id],名称)
其中pilot_id指的是... blablabla。
方括号定义每个实体的主键。
我正在等待的输出如下所示:
+------------------------------------------------+
| Inapt pilots |
+------------+-----------------+-----------------+
| First name | Last name | Simulator |
+------------+-----------------+-----------------+
| John | Doe | Falcon 7X |
| John | Doe | Embraer ERJ 140 |
| Foo | Bar | Falcon 20 |
+------------+-----------------+-----------------+
为每个不称职的飞行员提供他无法进入的模拟器。
最佳答案
首先,评论:您不需要 IS_TRAINED_FOR
表中的到期日期。飞行员和模拟器 ID 加上获取日期就足以保持唯一性。
回答您的问题:
是的,您的数据模型可用于所述目的。
除了我上面的评论之外,您的表定义都很好。
您要求的查询如下所示:
-- Get pilots that are no longer qualified for a simulator that they
-- have previously qualified for...
select distinct
P.first_name
, P.last_name
, S.name
from PILOT P
inner join IS_TRAINED_FOR T
on P.id = T.pilot_id
inner join SIMULATOR S
on T.simulator_id = S.id
where NOT EXISTS (select Q.acquisition_date
from IS_TRAINED_FOR Q
where Q.acquisition_date <= NOW()
and Q.expiration_date >= NOW()
and Q.pilot_id = T.pilot_id
and Q.simulator_id = T.simulator_id)
由于上述查询使用了内联接,因此只会显示曾经获得模拟器资格的飞行员,但由于 WHERE 子句,只有在其资格过期时才会显示。
请注意,使用相关子查询是因为,如果飞行员的资格已过期,但后来更新(并且仍然有效),那么简单地说诸如过期日期小于 NOW() 之类的内容就会失败。
要查看谁将在 X 个月内被取消资格,只需在上述查询中将 X 个月添加到 NOW() 中,如下所示:(对于此示例,假设 4 个月...)
DATE_ADD(NOW(),INTERVAL 4 MONTH)
要查看从现在到 x 个月后哪些人将被取消资格,请使用以下查询:
-- Get pilots whose qualifications will be expiring for a simulator that they
-- are currently qualified for...
select distinct
P.first_name
, P.last_name
, S.name
from PILOT P
inner join IS_TRAINED_FOR T
on P.id = T.pilot_id
inner join SIMULATOR S
on T.simulator_id = S.id
where NOT EXISTS (select Q.acquisition_date
from IS_TRAINED_FOR Q
where Q.acquisition_date <= DATE_ADD(NOW(),INTERVAL 4 MONTH)
and Q.expiration_date >= DATE_ADD(NOW(),INTERVAL 4 MONTH)
and Q.pilot_id = T.pilot_id
and Q.simulator_id = T.simulator_id)
and T.acquisition_date <= NOW()
and T.expiration_date >= NOW()
and T.expiration_date <= DATE_ADD(NOW(),INTERVAL 4 MONTH
第二个查询显示(例如)4 个月内不合格的飞行员,但现在他们已经合格。
关于mysql - 某航空培训中心数据库设计与查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28225992/
我是一名优秀的程序员,十分优秀!