从具有FK约束的多表中获取记录

时间:2013-09-25 07:15:17

标签: mysql

我正在尝试从多个表(3个级别)中获取数据。 scanario是客户向代理发送请求,代理处理它。对于客户我有表客户

    -----------------------------------------
    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      |    as@m.com
       2       |     xyz      |    vb@df.com
    -----------------------------------------

现在有另一个表名称Request,其中两个forign键都是请求表的复合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
    ----------------------------------------------------------
啊,现在记住所有这些表格,我必须显示有关请求生成客户的详细信息,即我需要

  -------------------------------------------------
   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是硬编码的,但是我不知道如何得到动态

  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

我尝试了很多其他的方法,但是每个人都没有给我我想要的东西我基本上只是为了得到客户所下的订单/请求类型。

注意:你会在查询中看到一些字段,但我在上面的表中没有提到只是为了节省时间,我放的所有数据都是虚拟的,可能不会彼此同步。

注意:如果您建议我更改表格,他们的连接结构让我知道并告诉我,如果我做错了。

1 个答案:

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

你如何使用参数?可能是从某种编程语言调用查询。在Delphi中,我会写下面的

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'

以上是基于第一次被问到的问题。对问题的编辑可能意味着上述内容不再回答被问到的问题。

我强烈建议您更改表的名称 - 这些通常是复数,例如人员,代理,请求等 - 以及表中的字段名称 - 将'agent_agentid'替换为'agent'; 'person_idperson'与'person'等。