Gilbert Skrevet 7. november 2003 Del Skrevet 7. november 2003 ønsker å lage en ti på toppliste over mest brukte ord i kolonnen "navn". altså et script som teller antall ganger hver navn forekommer, og lister de ti mest brukte: // TOPP-TI BRUKERE $query3 = "SELECT * FROM dagbok WHERE publiser = 0 LIMIT 0,10"; $result3 = mysql_query($query3); $number3 = mysql_num_rows($result3); ...så kom jeg ikke lenger... sitter fast Lenke til kommentar
Torbjørn Skrevet 7. november 2003 Del Skrevet 7. november 2003 $query3 = "SELECT navn,count(*) as antall FROM dagbok GROUP BY navn ORDER BY antall desc LIMIT 10"; echo "<table><tr><th>Navn<th>Antall"; $result3 = mysql_query($query3); while($hash = mysql_fetch_assoc($result3)){ echo "<tr><td>$hash[navn]<td>$hash[antall]"; } echo "</table>"; Lenke til kommentar
Gilbert Skrevet 7. november 2003 Forfatter Del Skrevet 7. november 2003 se der - da lærte jeg noe nytt: GROUP BY! dette åpner jo for uante muligheter... takker! Lenke til kommentar
Torbjørn Skrevet 7. november 2003 Del Skrevet 7. november 2003 Enjoy! Nyttig, men ergelig at Mysql ikke lar deg sortere internt i hver "GROUP BY"-kollaps, så enkelte ting må man gjøre i to queries. Lenke til kommentar
RottePostei Skrevet 8. november 2003 Del Skrevet 8. november 2003 Enjoy! Nyttig, men ergelig at Mysql ikke lar deg sortere internt i hver "GROUP BY"-kollaps, så enkelte ting må man gjøre i to queries. Hva mener du? Hvis du har en tabell f.eks. Bilkjøp: id navn bil dato_kjøpt og vil ha ut en gruppert liste over biler personene har kjøpt: SELECT * FROM Bilkjøp ORDER BY navn, dato_kjøpt Dette vil gruppere på navn, og sortere internt i gruppene på når bilen ble kjøpt. Skal du bare ha ut nyeste bil hver person har: SELECT navn,bil, MAX(dato_kjøpt) FROM Bilkjøp GROUP BY navn ORDER BY navn Lenke til kommentar
Torbjørn Skrevet 8. november 2003 Del Skrevet 8. november 2003 Jeg må få lov til å spørre om du vet hva "GROUP BY" gjør, siden det kan se sånn ut og du ikke har brukt det i dine eksempel queries, men istedet en ekstra "ORDER BY" Lenke til kommentar
RottePostei Skrevet 8. november 2003 Del Skrevet 8. november 2003 Glemte GROUP BY i siste querien, men tok den ikke med i første fordi jeg var usikker på hva du var ute etter. Lenke til kommentar
Torbjørn Skrevet 8. november 2003 Del Skrevet 8. november 2003 prøv det du foreslår, du vil sannsynligvis se at det ikke går, hvis ikke skal jeg slenge opp en demo. radene internt i GROUP BY kollapsen vil *ikke* sorteres, ORDER BY påvirker bare radene som faktisk returneres av queriet. Det gjør at man ikke kan både ta ut statistiske data som COUNT, MAX, MIN, etc... og i tillegg individuelle data basert på sortering internt, ved hjelp av ett query. Individuelle data fra en enkelt rad fra GROUP BY kollapsen er tilgjengelig, problemet er at man ikke kan velge hvilken man vil ta ut, så man får en tilfeldig rad basert på en eller annen intern sortering. Ubrukelig mao. Lenke til kommentar
RottePostei Skrevet 8. november 2003 Del Skrevet 8. november 2003 Ok. Begynner å skjønne poenget nå. Så det du sier er at selv om du bruker max eller min så vil ikke de andre verdiene nødvendigvis være de som tilhører max/min verdien ? Lenke til kommentar
Torbjørn Skrevet 8. november 2003 Del Skrevet 8. november 2003 Jeg korrigerte min forige post mens du skrev, sorry. Det jeg skriver øverst, "å sortere internt i en GROUP BY kollaps" sier egentlig det jeg vil. Jeg vil ha ut både statistiske data, sånn som jeg skrev, og individuelle data fra en enkelt rad (alle rader har individuelle data (selvsagt) men jeg vil ha ut data fra en spesiell rad i kollapsen, i tillegg til statistiske data for hele kollapsen) Dette *er* et velkjent problem, i Mysql 4.0 løser man det med et sub-query inni queriet. Det finnes et juksetriks for mysql 3 som er stygt, men som fungerer, husker ikke link, men det står i dokumentasjonen på mysql.com Lenke til kommentar
RottePostei Skrevet 8. november 2003 Del Skrevet 8. november 2003 Ok. Begynner å skjønne poenget nå. Så det du sier er at selv om du bruker max eller min så vil ikke de andre verdiene nødvendigvis være de som tilhører max/min verdien ? (noe som for så vidt gir mening siden du kan ha min() og max() på samme felt i en gruppe...) Lenke til kommentar
Torbjørn Skrevet 8. november 2003 Del Skrevet 8. november 2003 ja, max() og min() har ikke noe med sorteringen av radene å gjøre. Jeg skal vise mitt problem (skjedde for en uke siden, derfor jeg har dette klart for meg) Jeg har laget et forum, hvor jeg har en tabell med alle postene i. forenklet ser tabellen slik ut: emne melding forfatter tid id trad_starter_id feltene sier seg stor sett selv, trad_starter er id til den posten som starter tråden som posten befinner seg i. (litt mer invilket enn som så, men prinsippet er det samme) på framsiden av forumet lister jeg opp alle trådene i forumet, jeg viser også antall svar i tråden og dato for nyeste post i tråden, mitt query blir da f.eks: SELECT *,count(*) as antall_svar, max(tid) as nyeste_tid GROUP BY trad_starter_id ORDER BY nyeste_tid DESC LIMIT 20 Da vil jeg få ut antall svar på hver tråd, og jeg vil få ut tidspunkt for nyeste post, hvilket det også sorteres på, inga problem så langt. Men det er naturlig å også vise emne og forfatter for den øverste posten i hver tråd også, dette kan jeg imidlertid ikke hente ut fra query'et over. Jeg kan hente ut emne og forfatter, (idet jeg har med "select *,[...]"), men i hver rad vil det nå "ligge" et varierende antall poster som hører til samme trådstarter-post, men bare en av disse radene vil fylle feltene "emne" og "forfatter" (og "melding") i query'et mitt. Men ikke nødvendigvis den "øverste" posten (som er den jeg er ute etter) Jeg måtte med andre ord utfra "trad_starter_id" hente ut denne posten i etterkant og fra den hente emne og forfatter, istedet for å "få med dette på kjøpet" på den første spørringa. Håper dette var forståelig. Lenke til kommentar
RottePostei Skrevet 8. november 2003 Del Skrevet 8. november 2003 Ja. Skjønte problemet. Og oppdaget at jeg må endre en spørring i noe jeg har laget... Lenke til kommentar
RottePostei Skrevet 9. november 2003 Del Skrevet 9. november 2003 Husker du hvor den "skitne" løsningen sto? Forresten trodde jeg de fleste SQL-kompilere løste opp nøsta queries, så det burde vel gå an å skrive den som en enkel SQL-query. Lenke til kommentar
Torbjørn Skrevet 9. november 2003 Del Skrevet 9. november 2003 http://www.mysql.com/doc/en/example-Maximu...-group-row.html det står omtalt som "MAX-CONCAT trick", nesten lengst ned. Kan ikke se hvordan man skulle kunne nøste opp et nøsta query som dette? Lenke til kommentar
RottePostei Skrevet 9. november 2003 Del Skrevet 9. november 2003 Ikke jeg heller... får spørre noen som skriver SQL-compilere til databaser... Alternativ metode fra bruker på mysql.com: Bilkjøp: id navn bil dato_kjøpt SELECT DISTINCT navn,bil,dato_kjøpt FROM Bilkjøp LEFT JOIN Bilkjøp AS B2 ON Bilkjøp.navn=B2.navn AND Bilkjøp.dato_kjøpt < B2.dato_kjøpt WHERE B2.dato_kjøpt IS NULL ORDER BY navn; Dvs finn den raden for hver person som har største dato og ta med den (her kan vel ikke aggregeringsfunksjoner brukes da....) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå