26. marts 2005 - 23:21Der 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...
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
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)
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".
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 :))
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.
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
Select Efternavn, Fornavn, COUNT(DISTINCT Efternavn) AS AntalMedFamilienavn, COUNT(*) AS AntalMedFornavn GROUP BY Efternavn, Fornavn ORDER BY Efternavn, Fornavn
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...
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.