从ONE-TO-MANY关系中仅检索一条记录

时间:2015-02-12 17:59:32

标签: mysql sql database

我有2张桌子。一个是Agent,另一个是Agent_ContactAgent_Contact表用于维护Agent的联系信息。

AgentAgent_Contact的关系为One-To-Many,这意味着Agent可以有多个Agent_Contacts

Agent_Contact持有Foreign Key的{​​{1}}。

Agent可能Agents也没有Agent_Contact

现在,请看下面的代码。

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

现在,这会返回所有Agents及其Agent_Contact s(如果有的话)。但是假设一个Agent获得了15 Agent_Contact s,那么它将返回15行。

这不是我想要的。每Agent_Contact Agent就足够了。但是如何修改上面的sql查询来实现这个任务呢?

2 个答案:

答案 0 :(得分:0)

由于没有必须返回联系的规则,因此添加group by子句就足够了。

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

答案 1 :(得分:0)

如果您只希望每agent_contact次返回1 agent,那么问题是"您想要返回哪个agent_contact?"

这就像选择一个满20名学生的教室并说“#34;请返回1名学生。”#34;那么......你想要哪个学生?

在选择Agent_Contact时,您可以按字母顺序选择,或者选择名称最长的 ,这样可以将agent_contacts的数量减少到1。

此查询选择具有最大名称的agent_contact。你可以使用你想要的任何agent_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