Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从一对多关系中仅检索一条记录_Mysql_Sql_Database - Fatal编程技术网

Mysql 从一对多关系中仅检索一条记录

Mysql 从一对多关系中仅检索一条记录,mysql,sql,database,Mysql,Sql,Database,我有两张桌子。一个是Agent,另一个是Agent\u Contact。Agent\u Contact表用于维护Agent的联系信息 从Agent到Agent\u联系人的关系是One-to-Many,这意味着Agent可以有多个Agent\u联系人 Agent\u联系人正在持有Agent的外键 也可能有没有任何代理联系人的代理 现在,请看下面的代码 SELECT Agent.*, Agent_Contact.* FROM Agent LEFT JOIN Agent_Contact ON Agen

我有两张桌子。一个是
Agent
,另一个是
Agent\u Contact
Agent\u Contact
表用于维护
Agent
的联系信息

Agent
Agent\u联系人的关系是
One-to-Many
,这意味着
Agent
可以有多个
Agent\u联系人

Agent\u联系人
正在持有
Agent
外键

也可能有没有任何
代理联系人的
代理

现在,请看下面的代码

SELECT Agent.*,
Agent_Contact.*
FROM Agent
LEFT JOIN Agent_Contact ON Agent.idAgent = Agent_Contact.idAgent
现在,这将返回所有
代理及其
代理联系人
s(如果有的话)。然而,假设一个
Agent
获得了15个
Agent\u联系人
s,那么它将返回15行


这不是我想要的。一次
Agent\u每个人联系
Agent
就足够了。但是我如何修改上面的sql查询来完成这个任务呢?

因为没有必须返回哪个联系人的规则,所以添加一个GROUPBY子句就足够了

SELECT Agent.*,
Agent_Contact.*
FROM Agent
LEFT JOIN Agent_Contact ON Agent.idAgent = Agent_Contact.idAgent
GROUP Agent.idAgent

如果您只希望根据
agent
返回1个
agent\u联系人
,那么问题是“您希望返回哪个agent\u联系人?”

这就像选择一个满是20名学生的教室,然后说“请返回1名学生”。那么……你想要哪个学生

在选择代理联系人时,您可以按字母顺序选择,或者选择名称最长的联系人,或者选择将代理联系人数量减少到1的内容

此查询选择具有最大名称的代理联系人。您可以使用任何您想要的agent\u contact列,它只需要放在一个只返回一种类型的聚合函数中

SELECT t.Id, ac.* FROM
(SELECT Agent.Id, Max(AgentContact.Name)
FROM Agent
LEFT JOIN Agent_Contact ON Agent.idAgent = Agent_Contact.idAgent
GROUP BY Agent.Id) as t
INNER JOIN Agent_Contact as ac ON t.Name = ac.Name

使用子查询而不是联接来获取代理联系人数据。强烈建议使用内部联接而不是左联接。@HddnTHA为什么?你明白OP为什么使用左连接吗?提示:“有些代理也可能没有任何代理联系人。”@HddnTHA Nope,现在你有一个
代理,其余的都被限制在外。你想要哪个代理联系人?如果答案是“没关系”,那么这通常表明设计不佳。这应该很重要!这并不总是有效的。有些系统会要求您在非idAgent列上使用聚合函数。@LCII我知道这在MS SQL上不起作用,但在mysql上应该起作用。你在说什么系统?