2013-01-14 58 views
0

我正在創建一個具有時間表和飛行員表的飛行學校的預訂數據庫,作爲當天航班的視覺日程安排類型表示。直到他們獲得了需要副駕駛的飛機之後,我纔開始工作。在加入時有2個字段的MySQL加入

他們有一些飛行員永久在名冊上(他們希望總是看到規劃師),還有一些偶爾使用(他們只希望在那天爲他們預訂時留在那裏)。他們還希望能夠在計劃者中設置自己的飛行員訂單,所以我在員工記錄中設置了一個int_LISTORDER字段,該列表將訂單設置在列表中,並且只有在預訂時才顯示int_LISTORDER爲500以上的人是爲他們製作的。爲了增加一個副駕駛員,除了txt_STAFFNAME之外,預訂中還增加了一個txt_STAFFNAME2的領航員。

我與原試點以下查詢的唯一版本,選擇所有誰擁有在某一天預約(該$tl_date變量)相匹配的人員列表飛行員的列表,並獲得他們的名單,以便飛行員,和合並與誰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聲明以獲取'tbl_booking_detail'中的飛行員(txt_STAFFNAME)和副駕駛員(txt_STAFFNAME2)及其列表順序() 210)從'tbl_staff_detail'誰在該特定的一天預訂成爲一個表'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

你能爲我們提供表模式,樣本數據和預期的輸出嗎? :) – bonCodigo

+0

編輯問題與請求的細節。 –

回答

0

經過進一步研究,看來我可能過度設計或複雜了我的原始解決方案,因爲我可能從「錯誤的角度」來解決這個問題。一個完整的重新思考的查詢和使用工作人員表的查詢,而不是正確的左側也拿出這似乎工作如下:

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 

只需使用一個簡單連接。我認爲只有當飛行員和副駕駛員的指數高於500時,纔會返回第一名飛行員姓名,但是如果我有一天預訂,並且兩位飛行員都超過500,那麼他們都會返回,所以成功!

感謝任何看過並給了它一些想法的人,即使他們沒有發佈任何東西或想出解決方案。

歡呼

Braedon