Подзапрос Mysql с проблемой «in» для связывания родительской таблицы

#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, именно так помечен ваш вопрос. Вы не указали базу данных, которую используете.