23. november 2010 - 10:55Der 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 :)
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
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
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
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 !
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.