MySQL连接在连接中有2个字段

时间:2013-01-14 12:04:11

标签: mysql join

我正在为飞行学校创建一个预订数据库,其中包含时间表和飞行员,作为当天航班的视觉日程表类型表示。我让它工作正常,直到他们获得了一架需要副驾驶的飞机。

他们在名册上永久有一些飞行员(他们希望一直在计划员身上看到),还有一些偶尔使用的飞行员(当他们当天预订时他们只想在那里)。他们还希望能够在计划员上设置他们自己的飞行员顺序,因此我在员工记录中创建了一个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        |
--------------------------

1 个答案:

答案 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