0

我正在尝试从多个表(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
    -----------------------------------------

现在有另一个表名请求,其中两个外键都是请求表的复合 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 在查询的最后部分是硬编码的,应该是,但我不知道 get 是如何动态的

  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

我尝试了很多其他方法,但每个人都没有给我想要的东西,我基本上被困在一个点上,以获得客户下的订单/请求类型。

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

注意:如果您建议我更改表格及其连接结构,请告诉我并指导我是否做错了。

4

1 回答 1

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' 等。

于 2013-09-25T07:35:09.317 回答