28. maj 2003 - 22:00Der er
37 kommentarer og 2 løsninger
En SQL-haj der kan hjælpe med et statement?
Jeg har opbygget et stort forum. Ved visning af alle spørgsmål joines fire tabeller, men jeg kan godt illustrere problemet med kun de to primære tabeller her - nemlig den med spørgsmål og den med svar.
Select spm.Overskrift, Count(svar.SvarID) As Indlaeg From spm Left Join svar On spm.SpmID = svar.SpmID Group By spm.Overskrift
Denne udtrækker alle spørgsmåloverskrifter fra tabellen "spm" og finder ud af, hvor mange relaterede poster, der findes i tabellen "svar" (altså antal indlæg i hvert spørgsmål). Men nu kunne jeg godt tænke mig, at brugeren kunne vælge kun at få vist de spørgsmål, som vedkommende deltager i (dvs. fx. hvor svar.BrugerID=7). Det er heller ikke noget problem med en where-clause, men så returnerer count (indlaeg) kun det antal poster som brugeren har lavet i den pågældende tråd logisk nok. Og den skal returnere ALLE. Præcis ligesom her på Eksperten under "Spørgsmål hvor du deltager".
hmmm... efter at have læst dit indlæg (igen) tror jeg nok, at min løsning kommer frem til det samme, som dit forsøg - nemlig at den kun optæller de svar, som brugeren selv er ansvarlig for...
faktisk tror jeg ikke at du kan hente de (egenlig to forskellige) informationer ud med kun éen query ---
Hehe... Jeg kan ikke få det til at fungere med Having. Der får jeg bare en fejlmeddelelse. Jeg kan desværre ikke bruge din, bearhugx, fordi jeg har nogle left joins med de to øvrige tabeller, hvor jeg tjekker på null.
2 queries - hvor den ene kun udtrækker antal indlæg? Det kan vel også blive et problem, eftersom jeg også skal have en where-clause på den, for kun at tælle indlæg for de spørgsmål, hvor brugeren deltager.
Jeg kan sige at jeg kører MySQL 4.1 nu - og selve db'en virker fint - men skal man til at bruge gui-interfaces såsom MysqlCC eller Mysql-front, så kan man kun logge på med root på Localhost (== Password=""), da der åbenbart er kommet et ny authentication scheme, som disse gui's ikke understøtter...
Hvis det VIRKELIG ikke kan lade sig gøre, kan jeg kun se IN-operatoren som en løsning eller oprettelse af en fysisk temp-tabel. Men begge dele går temmelig meget ud over performance desværre...
først lav en query, som finder alle spm, som bruger deltager i - derefter så query for count - for der har du jo allerede en liste med spmID - så det er forholdsvist nemt at lave det med 2 queries...
Og så samle op i en kommasepareret liste. Og til sidst udtrække alle data:
Select spm.Overskrift, Count(svar.SvarID) As Indlaeg From spm Left Join svar On spm.SpmID = svar.SpmID Where spm.SpmID IN(liste) Group By spm.Overskrift
Det er et lidt problematisk spm, da MySQL AB har en del, som de gerne vil have med i deres 4.1 -
4.1.0 er i alpha-release og der virker subselects pt. - men som sagt - det er kun alpha --- Så det eneste, jeg kan sige er at subselect-mulighed er kommet ind under udarbejdelsen af 4.1.0 - men hvornår ...????
Min having virkede ikke, fordi man kun kan bruge having på noget der rent faktisk selectes.
Det havde jeg glemt.
Du kan derfor kun bruge having til:
Select spm.Overskrift, Count(svar.SvarID) As Indlaeg From spm Left Join svar On spm.SpmID = svar.SpmID Group By spm.Overskrift having spm.overskrift like 'a%'
Udover at selecte svar.brugerID har du også måttet tilføje den til group by, fordi alle ikke aggregerede funktioner i select listen også skal optræde i group by.
Og det er det som er skyld i at igen bliver der sorteret for meget fra.
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.