#sql #subquery
#sql #подзапрос
Вопрос:
Я пытаюсь создать запрос, который выбирает контактную информацию (таблицу invoice_contacts
), а адреса (таблица invoice_adresses
) связываются с контактом, который наиболее часто используется в (таблице invoice_compta
)
Например, у меня есть два контакта :
- Майк
- Джон
У Майка есть 2 адреса :
- Париж
- Лондон
У Майка есть 1 счет-фактура с Парижем и 5 счетов-фактур с Лондоном, поэтому я хочу, чтобы адрес Лондона был связан с Майком.
Я попробовал этот запрос с подзапросом, который подсчитывает все адреса, связанные с контактом для адресов (с NB_ADRESSES
), и выбирает только самый большой (с order by NB_ADRESSES desc
и limit 1
), кажется, хорошо, но у меня ошибка, когда я делаю where ia2.ID_CONTACT = ic.ID_CONTACT
ic.ID_CONTACT не найден.. (и мне нужно связать контакт с подзапросом).
select ic.*,
ia.*
from invoice_contacts ic
left join invoice_adresses ia on ia.ID_CONTACT = ic.ID_CONTACT
and ia.ID_ADRESSE in (
select ia3.ID_ADRESSE
from (
select ia2.ID_ADRESSE,
count(*) as NB_ADRESSES
from invoice_adresses ia2
left join invoice_comptas ico on ico.ID_ADRESSE_CONTACT = ia2.ID_ADRESSE
where ia2.ID_CONTACT = ic.ID_CONTACT
group by ia2.ID_ADRESSE
order by NB_ADRESSES desc
limit 1
) as ia3
)
group by ic.ID_CONTACT
order by CONTACT_TITRE asc
Я также пытаюсь использовать «exist» или «inner join» вместо «in», но я не нахожу хороших результатов, поэтому мне кажется, что это лучший способ для этого запроса, но я не нашел решения.
Я надеюсь, что вы мне поможете 🙂
Спасибо
ОБНОВЛЕНИЕ: итак, наконец, я нашел решение с этим запросом :
select ic.*,
ia.*
from invoice_contacts ic
left join invoice_adresses ia on ia.ID_CONTACT = ic.ID_CONTACT
and ia.ID_ADRESSE = (
select ia3.ID_ADRESSE
from (
select ia2.*,
count(*) as NB_ADRESSES
from invoice_adresses ia2
left join invoice_comptas ico on ico.ID_ADRESSE_CONTACT = ia2.ID_ADRESSE
group by ia2.ID_ADRESSE
) as ia3
where ia3.ID_CONTACT = ic.ID_CONTACT
order by NB_ADRESSES desc
limit 1
)
group by ic.ID_CONTACT
order by CONTACT_TITRE asc
Спасибо
Комментарии:
1. У Майка есть три адреса? Вы указали только два.
2. @GordonLinoff да, спасибо, я исправил с двумя
Ответ №1:
Позвольте мне перефразировать проблему как поиск наиболее распространенной комбинации контакт / адрес для данного счета.
Мне трудно следовать вашему запросу и именованию вашей таблицы. Но это идея:
select contact, address
from (select contact, address, count(*) as cnt,
row_number() over (partition by contact order by count(*) desc) as seqnum
from invoices
group by contact, address
) ca
where seqnum = 1;
Подзапрос подсчитывает, сколько раз данный адрес (или город, если хотите) встречается для каждого контакта. row_number()
Перечисляет их, поэтому наиболее распространенный имеет значение «1». Затем внешний запрос выбирает наиболее распространенное значение.
Комментарии:
1. Спасибо за вашу помощь, я не знаю метода разделения, но, похоже, он не работает с моей версией mysql, но я понимаю, что вы имеете в виду в своем запросе, наконец, я только что нашел решение своей проблемы (я обновлю свой пост)
2. @FlorianRichard . , , Этот ответ является стандартным SQL, именно так помечен ваш вопрос. Вы не указали базу данных, которую используете.