2014-04-18 53 views
1

我正在開發一個系統,一些快遞員可能會要求他們的首選旅行。如果有多名員工要求參加某個特定的旅程,我想先將它交給首先爲我們工作的人。我想說明一個表情符號或類似這樣的可用MySQL:在三個表中選擇

  1. 旅遊概覽頁面上別的東西
  2. 你會踢有人在
  3. 由某人誰最先啓動

我想它已請求幾個小時,但我無法獲得它的MySQL代碼。 我有3個相關的表格。

  1. 員工:
    • 僱員
    • 進入
    • 日期...
  2. 旅遊
    • tourid
    • 細節...
  3. 要求
    • 員工ID
    • tourid

我希望選擇所有的旅遊,包括他們的詳細信息 - >易

我想(至少)再添對該巡視中的請求進行統計,以便進一步查詢。我想我需要一個選擇與tourid從1查詢

最好的將是一個查詢,包括一個if-else語句的結果,tourid後面的字段將爲NULL,如果旅遊可用或顯示如果請求人數> 0

請求參觀的最老員工的日期我非常感謝您的任何建議!

謝謝!

回答

0

2)我想(至少)添加一個字段指望着這點 巡演作進一步的查詢請求。我想我需要一個選擇與tourid從 的1

SELECT R.tourid, COUNT(R.tourid) 
FROM Requests R 
GROUP BY R.tourid; 

添加一個字段以跟蹤彙總信息會使事情顯著更加複雜(需要如觸發器),並會在原則上,是不成熟優化。

3)優化將是一個查詢包括if-else語句與 結果,該tourid背後的領域將是NULL,如果遊 提供或顯示最古老的員工的入境日期誰 要求導遊如果requestcount> 0

SELECT T.tourid, RE.min_date_of_entry 
FROM Tours T 
LEFT OUTER JOIN (
    SELECT R.tourid, MIN(E.date_of_entry) AS min_date_of_entry 
    FROM Requests R 
    INNER JOIN Employees E ON E.employeeid = R.employeeid 
    GROUP BY R.tourid 
    ) RE ON RE.tourid = T.tourid; 

在寫SQL,你應該儘可能使用關係邏輯運算符如連接,而不是像條件語句必要的工具。在這種情況下,每當REINNER JOIN,如果不匹配時將跳過行)中的匹配項不匹配,則LEFT OUTER JOIN將在RE的任何列中產生NULL值。請注意,如果您計劃使用最低入境日期來確定請求僱員,您將必須處理角落案件。例如,如果員工的入職日期相同,會發生什麼情況?

+0

非常感謝!這正是我想要把所有內容都放在一個查詢中。這是工作。我會盡力瞭解我們在這裏做什麼...... :) 如果日期相等,那麼年紀較大的人可以參觀... – user3549835

0

要選擇所有的旅遊,包括他們的詳細資料,你只需做

Select * from Tours; 

現在,您可以添加到一個名爲count旅遊表,用於跟蹤該特定tourID所有傳入請求的領域。 優選地,每當在請求表中進行更改時,保持觸發器更新計數值,即,如果發出新的請求,或者舊的被修改/刪除。

或者,你可以選擇不保存的價值,而是做

Select count(employeeID) from Requests, Tours where Requests.tourID = Tours.tourID; 

現在,每一個這些員工,你想要得到的最早加盟日期。

Select min(date_of_entry) from Employees where employeeID in (Select count(employeeID) from Requests, Tours where Requests.tourID = Tours.tourID); 

我不明白你是什麼意思的「三字之後的字段」,但我希望這至少部分地回答你的查詢。