gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:34:05 24 4
gpt4 key购买 nike

我正在尝试从多个表(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,其中两个外键都是请求表的复合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

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

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

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

最佳答案

不要使用内部查询,而是使用联接。

根据您的硬编码查询,答案似乎是

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'

以上内容基于最初提出的问题。对问题的编辑可能意味着上述内容不再回答所提出的问题。

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

关于mysql - 从具有 FK 约束的多表中获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18998542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com