我正在为飞行学校创建一个预订数据库,其中包含时间表和飞行员,作为当天航班的视觉日程表类型表示。我让它工作正常,直到他们获得了一架需要副驾驶的飞机。
他们在名册上永久有一些飞行员(他们希望一直在计划员身上看到),还有一些偶尔使用的飞行员(当他们当天预订时他们只想在那里)。他们还希望能够在计划员上设置他们自己的飞行员顺序,因此我在员工记录中创建了一个int_LISTORDER
字段,用于设置列表中的顺序,以及任何int_LISTORDER
个只有在为他们预订时才会出现500及以上。为了向混合中添加副驾驶,除了txt_STAFFNAME2
之外,预订还为试飞员添加了txt_STAFFNAME
字段。
我使用原始飞行员版本进行了以下查询,以选择在任何特定日期预订的所有飞行员($tl_date
变量)与工作人员列表中的飞行员列表相匹配并获取他们的列表-order,并将其与列表顺序低于500的飞行员列表合并:
(SELECT DISTINCT tbl_booking_details.txt_STAFFNAME AS txt_PILOT,
tbl_staff_details.int_LISTORDER AS int_ORDER
FROM tbl_booking_details
INNER JOIN tbl_staff_details
ON
tbl_staff_details.txt_PILOTNAME = tbl_booking_details.txt_STAFFNAME
WHERE tbl_booking_details.date_DATE = '{$tl_date}'
AND tbl_staff_details.txt_PILOTNAME !='--none--'
AND tbl_booking_details.txt_COMPLETECODE !='CANCELLED')
UNION
(SELECT tbl_staff_details.txt_PILOTNAME AS txt_PILOT,
tbl_staff_details.int_LISTORDER AS int_ORDER
FROM `tbl_staff_details`
WHERE tbl_staff_details.bool_ISPILOT =1
AND tbl_staff_details.bool_CURRENT =1
AND tbl_staff_details.txt_PILOTNAME != '--none--'
AND tbl_staff_details.int_LISTORDER <500)
ORDER BY ".STAFF_LIST_ORDER;
这个查询扩展了我对MySQL的了解,所以我需要弄清楚如何在UNION
语句之前修改查询的第一部分以获得导频列表(txt_STAFFNAME
)和'tbl_booking_detail'中的共同飞行员(txt_STAFFNAME2
)和来自'tbl_staff_detail'的列表顺序(int_LISTORDER
),他们在该特定日期预订到一个表中作为'txt_PILOT'和'int_ORDER'。希望WHERE子句中的字段和值的名称是仙女自我解释。
任何人都可以协助如何修改此查询以符合新标准吗?
问候
Braedon。
编辑:@bonCodigo
表格详细信息是(减去许多不相关的字段):
tbl_booking_details
------------------------------------------------------------------------------
ID | txt_STAFFNAME | txt_STAFFNAME2 | date_DATE | txt_COMPLETECODE | ...
------------------------------------------------------------------------------
475 | Joe A | Joe B | 2013-01-14 | CONFIRMED | ...
------------------------------------------------------------------------------
476 | Joe A | --none-- | 2013-01-14 | CONFIRMED | ...
------------------------------------------------------------------------------
476 | Joe C | Joe A | 2013-01-14 | CANCELLED | ...
------------------------------------------------------------------------------
477 | Joe B | Jane D | 2013-01-14 | CONFIRMED | ...
------------------------------------------------------------------------------
478 | Joe E | Jane D | 2013-01-14 | CONFIRMED | ...
------------------------------------------------------------------------------
tbl_staff_details
----------------------------------------------------------------------------
ID | txt_PILOTNAME | bool_CURRENT| bool_ISPILOT | int_LISTORDER | ...
----------------------------------------------------------------------------
1 | --none-- | 1 | 1 | 0 | ...
----------------------------------------------------------------------------
2 | Joe A | 1 | 1 | 5 | ...
----------------------------------------------------------------------------
4 | Joe B | 1 | 1 | 15 | ...
----------------------------------------------------------------------------
5 | Joe C | 1 | 1 | 510 | ...
----------------------------------------------------------------------------
6 | Jane D | 1 | 1 | 20 | ...
----------------------------------------------------------------------------
7 | Joe E | 1 | 1 | 520 | ...
----------------------------------------------------------------------------
期望的结果:
--------------------------
| txt_PILOT | int_ORDER |
--------------------------
| Joe A | 5 |
--------------------------
| Joe B | 15 |
--------------------------
| Jane D | 20 |
--------------------------
| Joe E | 520 |
--------------------------
答案 0 :(得分:0)
经过进一步的研究,似乎我可能过度设计或复杂化了我原来的解决方案,因为我可能从“错误的角度”来看待它。完全重新考虑查询并使用staff表作为查询的左侧而不是右侧已经提出以下似乎有效:
SELECT DISTINCT tbl_staff_details.txt_PILOTNAME AS txt_PILOTNAME,
tbl_staff_details.int_LISTORDER AS int_LISTORDER
FROM tbl_staff_details,tbl_booking_details
WHERE tbl_booking_details.date_DATE = '{$tl_date}'
AND tbl_booking_details.txt_COMPLETECODE != 'CANCELLED'
AND tbl_staff_details.txt_PILOTNAME != '--none--'
AND (tbl_staff_details.txt_PILOTNAME = tbl_booking_details.txt_STAFFNAME
OR tbl_staff_details.txt_PILOTNAME = tbl_booking_details.txt_STAFFNAME2)
UNION
SELECT tbl_staff_details.txt_PILOTNAME AS txt_PILOTNAME,
tbl_staff_details.int_LISTORDER AS int_LISTORDER
FROM `tbl_staff_details`
WHERE tbl_staff_details.bool_ISPILOT =1
AND tbl_staff_details.bool_CURRENT =1
AND tbl_staff_details.txt_PILOTNAME != '--none--'
AND tbl_staff_details.int_LISTORDER <500
ORDER BY int_LISTORDER ASC, txt_PILOTNAME ASC
只需使用简单的JOIN。我认为只有当一名飞行员和副驾驶员的指数高于500时,它才会返回第一个飞行员名称,但如果我当天有一个预订且两名飞行员都超过500,那么两者都归还,所以成功!
感谢所有看过的人并给予了一些思考,即使他们没有发布任何内容或提出解决方案。
欢呼声
Braedon