Avatar billede siphon Nybegynder
23. november 2010 - 10:55 Der er 3 kommentarer og
1 løsning

3 tabeller, COUNT() på en table uden at udelukke dem hvor count = 0

Hej.

Jeg ved ikke om min overskrift overhovedet giver mening men her er problemet.

jeg har 3 tables som jeg henter værdier fra.

1t = cat_id & cat_parent

2t = cat_id & cat_lang & cat_name

3t (En reference table product_id &  Cat_id er felterne)

opstilling er så at jeg skal have alle cat_id's fra 1t hvor cat_parent != 0

"SELECT * FROM 1t WHERE cat_parent != 0"

Derefter vil jeg have 2t.cat_name ud fra 1t.cat_id dog kun hvor 2t.cat_lang = 4

"SELECT * FROM 1t, 2t WHERE cat_parent !=0 AND 2t.cat_id = 1t.cat_id AND 2t.cat_lang = 4"

Nu skal jeg så tælle hvor mange hits der er i 3t på 1t.cat_id som 3t.cat_id

Har prøvet mig med:

"SELECT 1t.*, 2t.*, COUNT(3t.cat_id) AS num FROM 1t, 2t, 3t, WHERE cat_parent !=0 AND 2t.cat_id = 1t.cat_id AND 2t.cat_lang = 4 AND 3t.cat_id = 1t.cat_id"

Det virker fint BORT SET FRA at alle de 1t.cat_id's der endnu ikke er oprettet i 3t ikke bliver udvalgt og det skal de.

Hvordan kan jeg komme rundt om dette ?

Undskylder for stavefejl og mærkelige sætninger, stavning har aldrig været min forca :)

På forhånd mange tak
Avatar billede ggxdg Nybegynder
23. november 2010 - 11:06 #1
Hvis du skal have de t1.cat_id der både eksisterer og ikke eksisterer, kan du lige så godt bare lade være med at lave sammenligningen, og bare tælle 1t.cat_id i stedet...

Eller mener du at for at få de endre resultater, som ikke også eksisterer i t3 (altså resultater fra t1 og t2)?
I så fald, kan du vel lave det som en LEFT JOIN og/eller subquery
Avatar billede siphon Nybegynder
23. november 2010 - 11:25 #2
ggxdg > jeg mener det sidste du skriver, jeg skal bruge t1 og t2 informationerne ligegyldigt t3. Men samtidigt skal jeg have et felt der hedder num der indeholder antal af hits i t3 udfra t1.cat_id og hvis ikke der er et hit skal den bare skrive 0.

Kan du give et hurtigt eksempel på hvordan du ville bruge LEFT JOIN eller subquery til at løse dette ? har forsøgt med subquery men uden held :P

mange tak for det hurtige svar forresten
23. november 2010 - 12:46 #3
Om LEFT JOIN:  Du forbinder NU tabellerne paa den 'gammeldags' maade med WHERE klausuler.  JOIN er mere fleksibelt.  For eksempel:  SELECT * FROM 1t JOIN 2t ON 1t.cat_id = 2t.cat_id.  Der er to hoved-typer af JOIN, nemlig INNER JOIN og OUTER JOIN.  Med INNER JOIN faar man i ovennaevnte query alle raekker med matchende cat_id hvor cat_id findes i begge tabeller.  Med LEFT OUTER JOIN faar man det samme plus alle raekker hvor der er en cat_id i den venstre tabel selv om der ingen er i den hoejre tabel.  Hvis man blot siger JOIN forstaas INNER JOIN, og hvis man blot siger LEFT JOIN forstaas LEFT OUTER JOIN.  Man kan ogsaa bruge RIGHT JOIN hvis det er alle raekker fra den hoejre tabel man vil have.

Og saa undrer det mig at din tredje query gaar godt undtagen for at faa cat_id'er  der endnu ikke er oprettet i t3.  Du blander en gruppe funktion, COUNT(), med raekke-for-raekke funktioner.  Normalt vil du vaere noed til at inkludere en GROUP BY i queryen.

Denne query skulle virke og give dig antal hits = 0 hvor cat_id bestaar i t1 men endnu ikke i t3:

SELECT 1t*, 2t*, COUNT(3t.cat_id) AS num FROM 1T LEFT JOIN 2T ON 1t.cat_id = 2t.cat_id LEFT JOIN 3t ON 1t.cat_id = 3t.cat_id WHERE cat_parent != 0 GROUP BY 3t.cat_id
Avatar billede siphon Nybegynder
23. november 2010 - 14:14 #4
Hej dit svar var korrekt bortset fra GROUP BY 3t.cat_id skal sættes til GROUP BY 1t.cat_id

Bare hvis en anden skulle have brug for en ligende løsning.


Jeg vil sige MANGE TAK for hjælpen :P

Hav en god dag !
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester