24. juni 2008 - 14:37Der er
3 kommentarer og 2 løsninger
Tæl kombinationer
Jeg håber nogen kan hjælpe mig videre.
Hvordan tæller jeg antallet af forekomster af de forskellige kombinationer i tabellen [lister_email]?
Min tabel: [Tabel - liste_email] liste_email_id (autonr.) liste_email_listeid liste_email_emailid
[Tabel - emails] email listen
[lister_email] består af 200000 rækker hvor liste_email_emailid kan stå x antal gange med en tilhørende værdi i liste_email_listeid
liste_email_listeid kan have værdien fra 1 til 20
Det jeg gerne vil have af vide er hvor mange gang forekommer kombinationen 5 og 7, men hvor de emails så ikke er tilmeldt andre lister altså talene fra 1-20 minus 5 og 7
Jeg har leget lidt med følgende sql, men der giver mig også resultater hvor emailen ikke er tilmeldt 7: select distinct f1.LISTE_EMAIL_EMAILID,f1.LISTE_EMAIL_LISTEID from mailnow_liste_email f1,mailnow_emails where (f1.LISTE_EMAIL_LISTEID = '7' or f1.LISTE_EMAIL_LISTEID = '5') AND f1.liste_email_emailid=mailid AND (listen='15' OR listen='18') and f1.LISTE_EMAIL_EMAILID NOT IN (select distinct f2.LISTE_EMAIL_EMAILID from mailnow_liste_email f2 where f2.LISTE_EMAIL_LISTEID <> '5' AND f2.LISTE_EMAIL_LISTEID <> '7' ) group by LISTE_EMAIL_EMAILID
Hmm... Jeg kan ikke finde hoved og hale i dine relationer mellem tabellerne. Du bruger bl.a. et felt der hedder mailid i din forespørgsel, men den findes ikke i dine tabeller. Og hvorfer er liste 15 og 18 med som en selvstændig selektion i din forespørgsel? Du har også en GROUP BY i din forespørgsel, men ingen aggregat-funktion i din SELECT, så hvorfor er den der?
Hvis jeg alene skulle tage udgangspunkt i tabellen liste_email ud fra din beskrivelse og droppe alle forsøg på at gætte dine ønsker ud fra den viste forespørgsel, ville mit forslag nok være:
SELECT f1.liste_email_id, COUNT(*) AS TotalKombi5og7Antal, SUM(CASE WHEN f2.liste_email_id IS NULL THEN 1 ELSE 0 END) AS RenKombi5og7Antal, SUM(CASE WHEN f2.liste_email_id IS NULL THEN 0 ELSE 1 END) AS EjRen5og6Antal FROM liste_email f1 LEFT JOIN ( SELECT DISTINCT liste_email_id FROM liste_email WHERE liste_email_listeid <> '5' AND liste_email_listeid <> '7' ) AS f2 ON f1.liste_email_id = f2.liste_email_id WHERE f1.liste_email_listeid = '5' OR f1.liste_email_listeid = '7' GROUP BY f1.liste_email_id
De 15 og 18 skal du ikke bekymre dig så meget om, det er bare en ekstra klassificering af hvor de enkelte emails hører til.
Men bortset fra det, så fungere din foresøgelse ikke efter hensigten, den bliver ikke færdig, stoppede den efter 300sekunder.
Men det er nu også lige meget, for nu har jeg lavet det hele om. Ikke kun på grund af problemerne med sql'en, men projektet har selvfølgeligt også lige ændret sig, så jeg har ikke de samme behov længere :-)
Så i stedet for 20 lister har jeg nu kun 4, og disse registrerer jeg nu bare på den enkelte email direkte i dens tabel.
men hvis du vil have pt. kan du ligge et svar, du har dog brugt lidt tid på det.
OK, tak, du bestemmer selv, hvor mange point det er værd. Jeg kan ikke vurdere, om der til sidst ville være kommet et resultat frem, som vi kunne have arbejdet videre med. Men da projektet, som du siger, har ændret retning er det jo lidt overflødigt at tænke på. 200 point er i hvert fald for meget, for en trods alt meget begrænset indsats.
ok, nu er det jo ikke point jeg mangler, så vi deler da bare
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.