Когда я сталкиваюсь с проблемой, я обычно разбиваю запрос на более мелкие запросы, чтобы попытаться изолировать проблему.Так, например, просто присоединяйтесь от учетных записей к действиям, чтобы увидеть, если дублирование уже происходит, или если оно не происходит, пока вы не участвуете в сделках.
Теперь приступим к сортировке дубликатов.Мое предложение состоит в том, чтобы попытаться объединить все, используя таблицу сделок в качестве отправной точки, поэтому сделки, оставленные присоединенными учетными записями, должны возвращать учетную запись только один раз для каждой сделки, а операции оставленного объединения должны возвращать многие.
Другими словами, просто попробуйте изменить предложение о присоединении по сделкам с
on a.id = d.accountid and d.ownerid = ac.ownerid
на
on ac.accountid = d.accountid and d.ownerid = ac.ownerid
Если это не сработает, я бы попробовал переписатьзапрос от сделок как отправная точка, подобная этой ... Обратите внимание, что хорошей практикой является размещение соединения из полей в левой части предложения on.(например, выберите левое соединение b в a.id = b.id левое соединение c в 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'
Это делает большое предположение, что сделканевозможно сопоставить двум действиям с одним и тем же владельцем и идентификатором.Если это так, вам нужно присоединиться к действиям, используя идентификатор сделки, если в таблице действий есть идентификатор сделки.
Если это не сработает, я использую следующие подзапросы, чтобы изолировать дупс.Пример ...
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
Надеюсь, это поможет.Это всегда трудно без воссоздания необработанных таблиц.Попробуйте создать примеры таблиц, которые соответствуют вашей схеме, для db-fiddle и опубликовать ссылку.