Avatar billede alaflam Nybegynder
09. februar 2006 - 13:58 Der er 8 kommentarer og
1 løsning

sql and count!

hejsa,

select categories.*,count(*) as numtags from categories,tags where categories.id=tags.subcategory group by name order by name asc

ved at skrive denne sql så får jeg kun printet de categorier der har  tags (table) ??

tes(1)
asd(2)
fdassdf(4)

men dem der ingen tags har bliver ikke printet ud, og dem vil jeg også gerne have med, hvis jeg fjerner den WHERE sætning så fungere det ikke ?
Avatar billede coderdk Praktikant
09. februar 2006 - 14:26 #1
Prøv:

SELECT c.*, count(*) AS numtags FROM categories c LEFT OUTER JOIN tags t ON c.id = t.subcategory GROUP BY name ORDER BY name

Er ikke sikker på at det vil virke :P
Avatar billede alaflam Nybegynder
09. februar 2006 - 14:33 #2
den virker uden problemer, men viser alle 1 ? og det passer jo ikke rigtige
Avatar billede erikjacobsen Ekspert
09. februar 2006 - 14:41 #3
Hvad siger så:

SELECT c.*, count(t.subcategory) AS numtags FROM categories c LEFT OUTER JOIN tags t ON c.id = t.subcategory GROUP BY name ORDER BY name
Avatar billede ldanielsen Nybegynder
09. februar 2006 - 14:51 #4
SELECT c.name, count(*) AS numtags FROM categories c LEFT OUTER JOIN tags t ON c.id = t.subcategory GROUP BY c.name ORDER BY c.name
Avatar billede alaflam Nybegynder
09. februar 2006 - 15:08 #5
erik, kan aldrig tag fejl... når du skriver så ved jeg at vil fungere hehe mange tak


ldanielsen, du har bare skiftet t.subcategory til en stjerne :P men tak til dig

i må gerne kaste et svar !
Avatar billede erikjacobsen Ekspert
09. februar 2006 - 15:14 #6
Jeg samler slet ikke på point, tak. Men giver gerne en forklaring.

En LEFT JOIN tager alt med fra den venstre tabel. Der hvor der så ikke findes noget der passer i den højre tabel, indsættes en masse NULL-værdier. Men der kommer jo en række, så count(*), der tæller rækker, giver et 1-tal. count på et feltnavn løber dermod felterne igennem, og tæller kun dem med der er ikke-NULL.
Avatar billede ldanielsen Nybegynder
09. februar 2006 - 22:09 #7
Jeg skal heller ikke have point

Det eneste jeg gjorde var at droppe c.* fra select, og kun selecte den kolonne der var med i GROUP BY. Det plejer at være korrekt, og MSSQL ville bestemt ikke godtage det her.

Jeg må sige at jeg ikke satte mig ind i det, men blot rettede det jeg så som en oplagt fejl.

erikjacobsen > Måske du vil forklare mig hvorfor det ikke fremkalder en fejl, for det forstår jeg faktisk ikke. SELECT categories.* vil jo minimum returnere to kolonner, name og id (jeg mener da at name er en kolonne i categories)??
Avatar billede erikjacobsen Ekspert
09. februar 2006 - 22:12 #8
At tage en kolonne med, som ikke står i group by-listen, og som ikke er i en aggregatfunktion er en fejl i MSSQL (og andre), men ikke vi mange (alle?) versioner af MySql. Og det er en ting man kan undre sig over, ganske givet.
Avatar billede alaflam Nybegynder
05. marts 2006 - 12:23 #9
:) lukke tid!

siger mange tak igen
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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