我有 4 个表格,下面概述了列。我正在使用多个联接条件来引入"活动"表,这导致活动 ID 被复制,并映射到它们不应该是的交易 ID。活动 ID 映射到数据库中的账户 ID,因此存在此障碍。在下面的所需输出中,deals.id
可以为空。
我正在寻找下面的输出:
distinct count of activities.id| activities.accountid | deals.id | users.id | users.name
有没有办法做到这一点?也许创建一个索引、数组或一个新键?这里的任何指导将不胜感激!下面是数据的示例输出,其中只有一个代表的数据来展示问题。我正在使用普雷斯托;以下是我的查询:
select ac.id activityid, d.id as dealid, u.name, a.id as accountid
from accounts a
left join activities ac
on a.id = ac.accountid
join users u
on u.id = ac.ownerid
left join deals d
on a.id = d.accountid and d.ownerid = ac.ownerid
where u.name = 'John'
帐户:
id |
活动:
id | accountid | userid
交易:
id | accountid | userid
用户:
id | name
当我遇到问题时,我通常会将查询分解为较小的查询,以尝试隔离问题。因此,例如,只需从帐户加入到活动,以查看重复是否已经发生,或者是否在您加入交易之前没有发生。
现在开始整理骗子。我的建议是尝试使用交易表作为起点加入所有交易,因此交易左侧加入帐户应仅为每笔交易返回一次帐户,左侧加入活动应返回许多。
换句话说,只需尝试将交易下的加入子句从
on a.id = d.accountid and d.ownerid = ac.ownerid
自
on ac.accountid = d.accountid and d.ownerid = ac.ownerid
如果这不起作用,我会尝试从交易重写查询作为这样的起点......请注意,一个好的做法是将 join from 字段放在 on 子句的左侧。(例如,在 a.id = b.id 上选择左连接 B a.id = c.id,依此类推。
select ac.id activityid, d.id as dealid, u.name, a.id as accountid
from deals d
left join accounts a
on d.accountid = a.id
left join activities ac
on d.ownerid = ac.ownerid
and d.accountid = ac.accountid
left join users u
on d.ownerid = u.id
and u.name = 'John'
这是一个很大的假设,即交易不能映射到具有相同所有者和 ID 的两个活动。如果是这种情况,如果活动表中存在交易 ID,则需要使用交易 ID 加入活动。
如果这不起作用,我使用以下子查询来隔离重复。 示例...
select ac.id activityid, d.id as dealid, u.name, a.id as accountid
from (select * from deals where id in (18,7) d
left join (select * from accounts where id = 21) a
on d.accountid = a.id
left join (select * from activities where id = 13) ac
on d.ownerid = ac.ownerid
and d.accountid = ac.accountid
left join (select * from users where u.Name = 'John') u
on d.ownerid = u.id
我希望这有所帮助。如果不重新创建原始表,总是很难。考虑创建与您的架构匹配的示例表,并发布链接。