Avatar billede dank Nybegynder
19. oktober 2003 - 12:13 Der er 26 kommentarer og
2 løsninger

Hjælp til MySQL query

Jeg har en række der hedder visitors [int(10)]

I denne har jeg en række id numre, der kan f.eks. stå

10
22
10
88
48
44
33
22

Jeg ønsker nu at finde de 10 numre som forkommer flest gange, og evt. hvor mange gange de hvér forkommer?

Nogen der kan hjælpe med det?
Avatar billede kaptajnknark Nybegynder
19. oktober 2003 - 12:23 #1
jeg havde samme problem i forgårs :D

Jeg løste det ved at lave en midlertidig tabel med de kolonner jeg skulle bruge.
Derefter fandt jeg ud af hvilke id-numre der kunne forekomme og gemte tallet i en variabel
Så lavede jeg en løkke der fandt alle de poster i den oprindelige tabel hvor id = variablen - derefter talte sammen og ladge de rigtige info i den nye tabel

så kunne jeg derefter lave en forespørgsel der sorterede efter "antal hits"

og til sidst sletter den midlertidige tabel.
Avatar billede kaptajnknark Nybegynder
19. oktober 2003 - 12:23 #2
skulle måske have været lavet som et svar :D
Avatar billede Slettet bruger
19. oktober 2003 - 12:24 #3
SELECT visitors, COUNT(visitors) AS antal FROM dit_tabelnavn GROUP BY ip LIMIT 10

Så kan du evt sortere med ORDER, men det har du vel styr på :)
Avatar billede Slettet bruger
19. oktober 2003 - 12:24 #4
lol...group by ip skal naturligvis være group by visitors
Avatar billede dank Nybegynder
19. oktober 2003 - 12:30 #5
SELECT client_id, COUNT(client_id AS antal FROM pot_visitors GROUP BY client_id limit 10;

giver

You have an error in your SQL syntax near 'AS antal
FROM pot_visitors
GROUP  BY client_id
LIMIT 10 ' at line 1

Nogen der kan se hvad der er galt?
Avatar billede dank Nybegynder
19. oktober 2003 - 12:30 #6
kaptajnknark> Din løsning er nok ikke lige brugbar i dette tilfælde desværre :)
Avatar billede dank Nybegynder
19. oktober 2003 - 12:31 #7
client_id er den række der indeholder de enkelte id's
pot_visitors er tabellen
Avatar billede kaptajnknark Nybegynder
19. oktober 2003 - 12:33 #8
hehe det forventede jeg heller ikke, men det var da et bud
Avatar billede Slettet bruger
19. oktober 2003 - 12:34 #9
dank> Du skal lige lukke dine paranterser ;)

SELECT client_id, COUNT(client_id) AS antal FROM pot_visitors GROUP BY client_id limit 10;

Skulle gerne virke...
Avatar billede detox Nybegynder
19. oktober 2003 - 12:35 #10
SELECT client_id, COUNT(client_id AS antal FROM pot_visitors GROUP BY client_id limit 10;
Du mangler jo osse en parentes her:
SELECT client_id, COUNT(client_id) AS antal FROM pot_visitors GROUP BY client_id limit 10;
Avatar billede dank Nybegynder
19. oktober 2003 - 12:40 #11
1003 10
1005 1
1022 14
1831 196
3568 5
4296 95

... Det virker jo perfekt!

el_barto> Spørgsmålet er accepteret!

Et tillægsspørgsmål (så hæver jeg point hvis du/i har løst til at hjælpe med denne også)

Hvordan smider jeg dette ind i en løkke.. Normalt bruger jeg noget i retning af

$result = mysql_query("SELECT * FROM users");
while($row = mysql_fetch_array($result)) {
$var=$row[blahblah];
echo $var;
}

Bare som eksempel.. Men ovensteående querery som du har hjulet med er jo noget anderledes. Hvad kan man gøre?

Hvis du ikke har tid/lyst så sig bare til så lukker jeg ? her.
Avatar billede detox Nybegynder
19. oktober 2003 - 12:41 #12
Sådan her, hvis du vil have dem sorteret med de fleste øverst:

SELECT client_id, count(*) antal FROM pot_visitors GROUP BY client_id ORDER BY antal DESC LIMIT 10
Avatar billede dank Nybegynder
19. oktober 2003 - 12:42 #13
Detox> tak.. opret svar så får du også en lille sum point når jeg lukker.
Avatar billede Slettet bruger
19. oktober 2003 - 12:45 #14
Din løkke skal være fuldstændig den samme, der er ikke forskel der

$result = mysql_query("SELECT client_id, COUNT(client_id) AS antal FROM pot_visitors GROUP BY client_id limit 10;");
while($row = mysql_fetch_array($result)) {
$var = $row["client_id"];
echo $var;
}
Avatar billede dank Nybegynder
19. oktober 2003 - 12:45 #15
point hævet fra 30 -> 60 i håb om i kan hjælpe med det sidste lille ? om løkken.
Avatar billede detox Nybegynder
19. oktober 2003 - 12:46 #16
Du henter dem li'som du plejer:

while($row = mysql_fetch_array($result)) {
$var=$row['client_id']." Antal: ".$row['antal'];
echo $var;
}
Avatar billede dank Nybegynder
19. oktober 2003 - 12:46 #17
el barto> ok da.. Det query er bare lidt mere avanceret en de simple jeg normalt arbejder med.. jeg afprøver det om lidt.
Avatar billede Slettet bruger
19. oktober 2003 - 12:46 #18
nåhja, for god programmeringsskiks skyld bår limit være med stort altså LIMIT

Det er bare så det er nemmere at finde fejl og det gør det også nemmere at læse koden
Avatar billede detox Nybegynder
19. oktober 2003 - 12:50 #19
For fuldstændighedens skyld:

$sql = "SELECT client_id, count(*) antal FROM pot_visitors GROUP BY client_id ORDER BY antal DESC LIMIT 10";
$result = mysql_query($sql);
$output = "";
while($row = mysql_fetch_array($result)) {
  $output .= $row['client_id']." Antal: ".$row['antal']."<br />";
}
echo $output;
Avatar billede dank Nybegynder
19. oktober 2003 - 12:52 #20
ja sgu! I skal have mange tak begge 2.. point hævet til 90 som deles mellem el_barto og detox

el_barto> svar?
Avatar billede dank Nybegynder
19. oktober 2003 - 12:56 #21
jeg kan iøvrigt forstille mig at der kan komme lidt performance overhead når der er et par hundrede K rækker i denne tabel.

Er der nogen smart måde at optimere min tabel, så dette afvikles hurtigere?

(spørgsmålet er accepteret - det var bare lige hvis i vidste det på stående fod)
Avatar billede dank Nybegynder
19. oktober 2003 - 13:00 #22
detox> jeg skal ud af døren senere idag.. Jeg giver lige el_barto et par dage til at svare, ellers lukker jeg :)
Avatar billede detox Nybegynder
19. oktober 2003 - 13:01 #23
Det er i hvert fald en god idé at undgå 'echo' i while løkken (som i mit eks). Jeg tror osse det er hurtigere at bruge 'count(*)' end 'COUNT(client_id)', men der er jeg ikke helt sikker. Det har nok osse betydning, hvor vidt dine felter er indexeret, men det har jeg heller ikke 100% tjek på.
Avatar billede Slettet bruger
19. oktober 2003 - 13:01 #24
Jamen så lægger jeg et svar da...
Avatar billede dank Nybegynder
19. oktober 2003 - 13:03 #25
detox> ok tak.. det er heller ikke så vigtigt endnu.. har p.t. omkring 1000 entries.. og kunne nok nøjes med at køre det 1 gang dagligt via cron, så går det nok det er lidt tungt.

Tak skal i have begge 2
Avatar billede detox Nybegynder
19. oktober 2003 - 13:10 #26
Jeg lavede en lille benchmark på 56.000 rækker (med GROUP BY og ORDER BY):
count(*) = 0.0275 sec.
count(id) = 0.2189 sec. (Autonummereret)
count(kode) = 0.0280 sec. (Indexeret)
Så count(*) må være at foretrække.
Avatar billede dank Nybegynder
19. oktober 2003 - 13:14 #27
ja det ses tydeligt.. tak for input

(hvordan laver du sådanne benchmarks - er det bare på samme måde som du har svaret mig i andet spørgsmål?) Eller findes der en speciel metode til MySQL
Avatar billede detox Nybegynder
19. oktober 2003 - 13:26 #28
Jeg lavede forespørgslerne i phpMyAdmin, den viser hvor lang tid det tager.
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