Avatar billede sqwer Nybegynder
26. marts 2005 - 23:21 Der er 11 kommentarer og
1 løsning

count() for viderekomne

Lad os sige at jeg har en tabel med for- og efternavne på en række mennesker.
Så vil jeg gerne lave en query der finder alle folk der hedder Jensen til efternavn, og for hver af dem vil jeg også gerne vide hvor mange personer de deler fornavn med!

SELECT * FROM personer WHERE efternavn="Jensen"
er jo nemt nok, men kan jeg tælle fornavnene i samme ombæring? Jeg kan ikke lige se hvordan jeg skulle blande COUNT(*) ind i det, men jeg håber der er nogen der er klogere end mig :).

COUNT(*) skal jo medregne rækker der ikke har Jensen som efternavn... kan man det på en eller anden måde?

Ellers skal jeg jo køre hele resultatet fra den første søgning igennem mysql_fetch_assoc før jeg kender de fornavne der skal tælles, og så bliver det jo kæmpelangt...
Avatar billede detox Nybegynder
26. marts 2005 - 23:52 #1
I den her stil måske:

SELECT fornavn, count(*) FROM personer WHERE fornavn IN (SELECT fornavn from personer where efternavn='Jensen') group BY fornavn
Avatar billede detox Nybegynder
26. marts 2005 - 23:54 #2
Evt.:

SELECT fornavn, count(*) antal FROM personer WHERE fornavn IN (SELECT fornavn from personer where efternavn='Jensen') group BY fornavn
Avatar billede detox Nybegynder
27. marts 2005 - 00:03 #3
Ældre versioner af MySQL:

SELECT a.fornavn, count(*) antal FROM personer a LEFT JOIN personer b ON a.fornavn=b.fornavn WHERE b.efternavn='Jensen' GROUP BY a.fornavn ORDER BY antal
Avatar billede bromer Nybegynder
27. marts 2005 - 00:57 #4
Det kan godt være at jeg forstår det lidt anderledes, men vil du ikke have alle de personer der hedder jensen og så vide hvor mange der hedder for eksempel Peter Jensen etc? Det bør nemlig være en simpel GROUP BY

SELECT fornavn,count(1) FROM personer WHERE efternavn = 'jensen' GROUP BY fornavn;

Antallet af alle personer der hedder jensen er så summen af de counts, så den kan du summe op undervejs mens du hiver data ud i det script der behandler data (hvis du da har sådan et)
Avatar billede detox Nybegynder
27. marts 2005 - 01:03 #5
Jeg tolker nu dette udsagn:
"COUNT(*) skal jo medregne rækker der ikke har Jensen som efternavn"
som et tegn på det gælder antallet af fornavnebrødrene til "Jens'nerne".
Avatar billede bromer Nybegynder
27. marts 2005 - 01:05 #6
ja det har du nok ret i. Spøgs query :)
Avatar billede sqwer Nybegynder
27. marts 2005 - 10:25 #7
Takker detox, du er SÅ god :). Point på vej hvis du lægger et svar...
Jeg sidder desværre med en "ældre" version (4.0.23), men jeg har fået det hele til at gå op i en højere enhed nu.
(Og jeg ved godt det er en spøjs query, men jeg behøver vel ikke nævne at min lille for- og efternavnstabel var en omskrivning for at lette forklaringerne :))
Avatar billede detox Nybegynder
27. marts 2005 - 11:02 #8
Velbekommen
Avatar billede kjulius Novice
27. marts 2005 - 15:24 #9
I MySQL burde du altså bare kunne bruge en SQL som

Select Efternavn, COUNT(*) AS AntalMedFamilienavn, COUNT(DISTINCT Fornavn) AS AntalMedFornavn
GROUP BY Efternavn
ORDER BY Efternavn

(er ikke ude efter point, men kunne ikke lade være med at kommentere alligevel, da jeg ikke synes svaret er helt fyldestgørende)

Om man skal bruge COUNT(*) eller COUNT(1) (som er det samme som = COUNT(detførstefeltnavn)) er der delte meninger om. Virkningen er den samme. Nogle påstår godt nok, at COUNT(*) er marginalt langsommere. Personligt foretrækker jeg COUNT(*), da den gør det helt klart, at man tæller antal rækker inden for de grænser der er fastsat af GROUP BY - men det er en personlig smag.

COUNT(DISTINCT etfeltnavn) betyder, at man tæller de forskellige værdier der forekommer i feltet inden for de grænser, der fastsættes af GROUP BY.
Avatar billede kjulius Novice
27. marts 2005 - 15:29 #10
Det var da vist en værre gang sludder. Det skulle da vist have været lige omvendt:

Select Efternavn, Fornavn, COUNT(DISTINCT(Efternavn) AS AntalMedFamilienavn, COUNT(*) AS AntalMedFornavn
GROUP BY Efternavn, Fornavn
ORDER BY Efternavn, Fornavn

Beklager...
Avatar billede kjulius Novice
27. marts 2005 - 15:30 #11
Nu rabler det da vist helt :-(

Select Efternavn, Fornavn, COUNT(DISTINCT Efternavn) AS AntalMedFamilienavn, COUNT(*) AS AntalMedFornavn
GROUP BY Efternavn, Fornavn
ORDER BY Efternavn, Fornavn
Avatar billede kjulius Novice
27. marts 2005 - 15:44 #12
Arggh, den er helt gal... :-(

Glem det! Det kan jo nok kun laves ved at bygge den op som to queries baseret på hinanden, men det tror jeg til gengæld ikke MySQL kan klare:

SELECT personer.Efternavn, Fornavn, AntalMedFamilienavn, COUNT(*) AS AntalMedFornavn
FROM (SELECT Efternavn, COUNT(*) AS AntalMedFamilienavn FROM personer GROUP BY Efternavn) AS tmp INNER JOIN personer ON tmp.Efternavn = personer.Efternavn GROUP BY personer.Efternavn, Fornavn ORDER BY personer.Efternavn, Fornavn

Nå, men der må da være nogen som har fået sig et godt grin derude! Så intet er vel så skidt, at det ikke er godt for noget! :-)

God påske...
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