Mariadb SQL Выберите count с group by и выберите значения, отличные от NULL, от другого - PullRequest
0 голосов
/ 16 октября 2018

У меня проблема с реализацией моего запроса, может быть, кто-то из вас может мне помочь:)

У меня есть 3 таблицы:

1) Документы

DocRef  CustRef
Doc1    Cust1
Doc2    Cust2
Doc3    Cust1

2) LinkInter

DocRef  InterRef
Doc1    Inter1
Doc2    Inter2
Doc3    Inter3

3) Интер

id  InterRef    deliverychannel email   mobilenb    date    status
1   Inter1      Email           email1@email.be     2013-01-14T00:00:00Z    ok
2   Inter1      SMS                     0444111111  2013-01-12T00:00:00Z    ko
3   Inter1      Other           email5@email.be     2013-02-21T00:00:00Z    ko
4   Inter2      Email   email2@email.be 044456465465    2013-01-21T00:00:00Z    ko
5   Inter3      Email                               2013-01-21T00:00:00Z    ko
6   Inter3      SMS                                 2013-01-22T00:00:00Z    ko
7   Inter3      Other   email3@mail.be              2013-01-22T00:00:00Z    ko

, чтобы получить лучший вид, перейдите сюда: sqlfiddle

Результат, который я хочуявляется следующим:

CustRef | number of InterRef SMS KO| Last email known| Last mobilenb known
Cust1   | 2                        | email5@email.be | 0444111111

Я хочу, чтобы все клиенты, где канал доставки = 'SMS' и статус = 'ko', номер Inter (взаимодействия) со статусом 'KO',последнее известное электронное письмо и последний номер мобильного телефона.

Я пробовал с двумя функциями getLastEmailKnown и getLastmobilenbKnown, но с моими таблицами, которые насчитывают более 10.000.000 записей, это занимает много раз

Я могу получить такой результат на php странице, но это не решение, я хочу иметь только один запрос

Если я выполняю 3 запроса по отдельности, это работает, но я хочу только один

SELECT d.CustRef, count(DISTINCT i.InterRef) , i.email, i.mobilenb
FROM Documents d
    INNER join LinkInter link on link.DocRef = d.DocRef
    INNER join Inter i on i.InterRef = link.InterRef 
          and i.deliverychannel = 'SMS' 
          and i.status = 'ko'
group by d.CustRef 
Order by d.CustRef DESC;

SELECT distinct i.email as lastEmailKnown, d.CustRef
FROM Inter i
    INNER join LinkInter link on link.InterRef = i.InterRef
    INNER join Documents d on d.DocRef = link.DocRef
where d.CustRef = 'Cust1' AND email is not NULL and email <> '' ORDER by date DESC LIMIT 1;

SELECT distinct i.mobilenb as lastmobileKnown, d.CustRef
FROM Inter i
    INNER join LinkInter link on link.InterRef = i.InterRef
    INNER join Documents d on d.DocRef = link.DocRef
where d.CustRef = 'Cust1' AND mobilenb is not NULL and mobilenb <> '' ORDER by date DESC LIMIT 1;
...