2013-09-25 51 views
0

我試圖從多個表(3個級別)獲取數據。 scanario是客戶向代理商和代理商發送請求來處理它。對於客戶,我有表客戶從FK約束的多表中讀取記錄

----------------------------------------- 
    customerid | customername | fk_personid 
     1  |  abc  |  1 
     2  |  xyz  |  4 
    ------------------------------------------ 

客戶發送請求到代理誰將會處理它

---------------------------------------- 
    agnetid | agentname | fk_personid 
     6  |  asd  |  1 
     7  |  fgh  |  4 
    --------------------------------------- 

兩個以上的表是通過他們的父表的人連接

------------------------------------------ 
    personid | personname | personemail 
     1  |  abc  | [email protected] 
     2  |  xyz  | [email protected] 
    ----------------------------------------- 

現在有另一個表格名稱請求,其中兩個外鍵都是複合PK請求表

------------------------------------------ 
    FK_custmid | FK_agentid | requestype 
     1  |  1  | type one 
     2  |  2  | type two 
    ----------------------------------------- 

現在最後的事情是有六種不同類型的請求連接到請求表(父)通過FK。下面是單一類型休息的一張桌子都是一樣的。 下表中的上述複合體PK的FK的

----------------------------------------------------------- 
    req_id | req_FK_custmid | req_FK_agentid | requestype 
     1 |  1  |  1  | type one 
     2 |  2  |  2  | type two 
    ---------------------------------------------------------- 

ahhhhhhh現在保持所有這些表在我心目中顯示有關請求生成客戶即我需要

------------------------------------------------- 
    req_id | requestype | customer_id | agent_id 
    1 | type one |  1  | 1 
    ------------------------------------------------- 

細節我希望你們鱈魚得到我的觀點,可以幫助我找到解決辦法。我也試過它我自己喜歡

SELECT * FROM Agent,Request,Person,customer where Request.customer_idcutomer = customer.idcustomer and Request.Agent_idAgent = Agent.idAgent and Person.idPerson = customer.Person_idPerson and Person.idPerson = Agent.Person_idPerson 

這是不完整的,因爲我不知道如何完成它進一步。 1在查詢的結尾部分是硬編碼,從而shuld是可以,但我不知道如何得到的是dynamicall

SELECT request.SPOC_id, request.order_created, request.order_updated 
    FROM request 
    WHERE Agent_idAgent = ( 
    SELECT agent.idAgent 
    FROM agent 
    WHERE agent.idAgent =1) 
    LIMIT 0 , 30 

有這麼多其他approches我試過,但每個人都沒有給我我想要什麼,我基本上停留在一個點上以獲取客戶所下的訂單/請求類型。

注意:有些字段會在查詢中看到,但我沒有在上面的表格中提到過,只是爲了節省時間,我放的所有數據都是啞元,並且可能不會同步到對方。

注意:如果你建議我改變表格和他們的連接結構,讓我知道並指導我,如果我做錯了。

+0

從哪裏來的_「order_id」_和_「order_type」_來了? –

+0

這些將是requestid和請求類型的別名 –

+0

現在我編輯我的問題 –

回答

1

不使用內部查詢,而是使用連接。

根據您的硬編碼查詢,答案似乎是

SELECT request.SPOC_id, request.order_created, request.order_updated 
FROM request inner join agents 
ON agents.idAgent = request.FK_agentid 
WHERE Agent_idAgent = 1 
LIMIT 0 , 30 

爲了使這個查詢更一般的,你需要更換硬編碼「1」與參數(您的語法可能會有所不同)

SELECT request.SPOC_id, request.order_created, request.order_updated 
FROM request inner join agents 
ON agents.idAgent = request.FK_agentid 
WHERE Agent_idAgent = :p1 
LIMIT 0 , 30 

您如何使用該參數?這個查詢大概是從一些編程語言中調用的。在德爾福,我會寫以下內容

with MyQuery do 
begin 
    parambyname ('p1').asinteger:= 7; 
    open; 
    ... 
    close 
end; 

這將檢索代理7的所有請求。由於您的表格設計不允許代理具有名稱(該名稱可在Person表中找到),因此更難以展示如何檢索名稱爲kwk.stack的代理的所有請求。

SELECT request.SPOC_id, request.order_created, request.order_updated 
FROM request inner join agents 
ON agents.idAgent = request.agent_agentid 
inner join person on person.idperson = agents.person_idperson 
WHERE person.name = 'kwk.stack' 

以上是基於首次提出的問題。對這個問題的編輯可能意味着上述不再回答被問到的問題。

我強烈建議您更改表格的名稱 - 這些通常是複數形式,例如People,Agents,Requests等 - 以及表格中的字段名稱 - 將'agent_agentid'替換爲'agent'; 'person_idperson'和'person'等。

+0

thanx的答覆,但這是我面臨的問題,我沒有任何想法下一個硬編碼1的位置,以得到所需的結果 –

+0

這更好的解決方案,但我需要問如何訪問請求類型的名稱例如電影,手機或任何來自代理商的客戶請求也應顯示在結果表中 –

+0

@ kwk.stack:提出一個新問題,提供完整的表結構。基本上,你必須加入至少一個其他表到你的查詢。 「請求」表包含'RequestTypes'表的外鍵,因此您可以鏈接到此表,並向選擇查詢中添加像RequestTypes.Name這樣的字段。 –