Autor Zpráva
Clint
Profil
Zdarec, měl bych na Vás dotaz? Mám 3 tabulky:

nl_email_cross_contactList_contact se sloupci contactList, contact_id, e_active (propojení emailů s kontakt listy)
nl_email_cross_campaign_contactList se sloupci cam_id a contactList_id (propojení kontakt listu s kampaněmi)
nl_email_contact se sloupci id, email, deleted (emaily)

poz. jeden mail může být ve více kontakt listech

Tabulky jsou propojené následovně:
nl_email_contact.id = nl_email_cross_contactList_contact.contact_id +
nl_email_cross_contactList_contact.contactList = nl_email_cross_campaign_contactList.contactList_id

Posílám tento dotaz:
SELECT DISTINCT nl_email_contact.e_email, nl_email_contact.id
FROM nl_email_cross_campaign_contactList
LEFT JOIN nl_email_cross_contactList_contact ON nl_email_cross_contactList_contact.contactList_id = nl_email_cross_campaign_contactList.contactList_id
LEFT JOIN nl_email_contact ON nl_email_contact.id = nl_email_cross_contactList_contact.contact_id
WHERE nl_email_cross_campaign_contactList.cam_id = 84 AND nl_email_cross_contactList_contact.e_active = "Y" AND nl_email_contact.deleted = "N"

Vše funguje dobře.

Můj dotaz zní: pokud bude jedna kampaň napojena na více kontakt listů a v každém kontakt listu bude stejný mail a alespoň jeden bude mít nastaveno e_active = "N" tak ve výsledku selectu nebude. Asi to zavání vnořeným select dotazem nebo case sensitive. Problém je, že abych mohl ve vnořeném dotazu pracovat s daty potřebuji k tomu email, který ale získá vnější select. A co vím, tak vnitřní select se provede dřív než vnější. Možná se pletu, ale nevím jak ten dotaz poskládat.

Díky za pomoc
juriad
Profil
Clint:
Takže chceš jen ty emaily, které ani v jednom listu nebyly zakázány. Mimochodem, komu jsi co provedl, že máš ty tabulky tak „prakticky“ pojmenované.

Tento dotaz vrátí všechny kontakty, které jsou v alespoň jednom kontakt listu a nejsou nikde zakázané. Protože 'N' < 'Y', tak ta poslední podmínka s MIN testuje, zda všechny zmínky tohoto kontaktu jsou 'Y'.
SELECT DISTINCT co.id, co.e_mail
FROM nl_email_contact co
JOIN nl_email_cross_contactList_contact cl_co ON co.id = cl_co.contact_id
WHERE co.deleted = 'N' # nechceme filtrovat podle e_active (to uděláme až na závěr)
GROUP BY co.id # sdružíme si všechny zmínky podle kontaktu
HAVING MIN(cl_co.e_active) = 'Y' # vyžadujeme aby žádná zmínka neobsahovala 'N'

Teď do toho ještě přidáme tu kampaň:
SELECT DISTINCT co.id, co.e_mail
FROM nl_email_contact co
JOIN nl_email_cross_contactList_contact cl_co ON co.id = cl_co.contact_id
JOIN nl_email_cross_campaign_contactList ca_cl ON ca_cl.contactList_id = cl_co.contactList
WHERE co.deleted = 'N' AND ca_cl.cam_id = 84
GROUP BY co.id
HAVING MIN(cl_co.e_active) = 'Y'

Šlo by to i přes vnořený dotaz a harakiri s LEFT JOIN nebo pomocí EXISTS, ale pokud jsou jen dvě hodnoty ('N', 'Y'), tak by MIN mohlo fungovat.
Clint
Profil
Bohužel to nefunguje zkusil jsem HAVING MIN i HAVING MAX a vždy to vytáhne email, který v jednom kontakt listu je aktivní a ve druhém neaktivní. Čili výsledek je neaktivní
juriad
Profil
Zrovna jsem to u sebe otestoval, a funguje mi to.
Moment, můj dotaz testuje jen contact_list, které jsou u té vybrané kampaně.
Jak se to má chovat pro e_mail, který je zakázaný v kontakt listu pro kampaň 85, ale je povolený pro kampaň 84?

Bude se to chovat podle tvých představ, pokud podmínku na kampaň přesuneš až na konec, do HAVING? To by samozřejmě byla blbost.
Kajman
Profil
Ještě může být problém v tom, pokud tam je někde stejný email s jiným id.
Clint
Profil
Problém jsme zjistil v tomto: mám tabulku nl_email_cross_contactList_contact

pokud si vyfiltruji mail a je uložený v tomto pořadí tak to projde:
1 - 1 - N
2 - 1 - Y
3 - 1 - N

kde 1,2,3 jsou id kontaktních listu (první sloupec), 1 id kontaktu (např. mail@mail.cz) (druhý sloupec), třetí sloupec aktivní neaktivní

pokud ale je to takto tak se kontakt vždy zobrazí
1 - 1 - N
2 - 1 - Y
3 - 1 - Y

vždy záleží na poslední položce v tabulce zda má Y nebo N

Kajman nemůže být problém že mail má jedinečné id ale je napojeno na různé id kontakt listů?
juriad
Profil
Clint:
Zkoušel jsem ve svém testu změnit pořadí a pořád to funguje.
Má contact-list 1 napojení na kampaň 84? Pokud ne, tak každý chápeme zadání jinak. (V takovém případě se záznam 1-1-N vůbec neuvažuje.)
Kajman
Profil
Clint:
Když je řádek s e_active='N' označen jako smazaný (deleted = 'N'), má se brát v potaz?
Clint
Profil
příklad z tabulky:

2 2 N
3 2 Y
7 2 N
15 2 Y
25 2 Y

první sloupec - contactList_id - id kontaktních listů (v kampani 84 jsou propojené tyto kontakt. listy 2,3,15
druhý sloupec - contact_id (identifikátor na mail mal má nastaveno deleted = 'N' - čili se musí brát na to zřetel)
třetí sloupec - e_active - aktivita neaktivita
Kajman
Profil
Clint:
Udělejte prosím vzor dat všech tří tabulek na sqlfiddle, tak by ten druhý dotaz z [#2] vracel chybný řádek.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: