20. maj 2012 - 15:55Der er
6 kommentarer og 1 løsning
finde højeste værdi i db
jeg har x antal artikler, som folk stemmer på. Artiklerne ligger i diverse kategorier. tabel for artikler: Indhold indhold_id | indhold | kat_id
Stemmerne gemmer jeg i en seperat tabel: Stemmer stemme_id | indhold_id | stemme
jeg ønsker så at finde de artikler som har fået flest stemmer i hver kategori. jeg har følgende, som fint finder den artikel som har flest stemmer, men kan ikke regne ud hvordan jeg kobler på, så den tager de bedste fra hver kat_id
SELECT stemmer.indhold_id, stemmer.stemmer FROM stemmer JOIN indhold ON stemmer.indhold_id = indhold.indhold_id WHERE stemmer.stemmer =(select max(stemmer) FROM stemmer)
Et spørgsmål til spørgsmålet: Hvordan bruger du tabellen Stemmer? Fra den query du viser kunne det se ud til, at du i Stemmer har en række for hver artikel og i feltet Stemmer har du det totale antal stemmer afgivet på artiklen. For eksempel
Stemmer id indhold stemme 1 27 12 2 35 5
Altså 12 stemmer afgiet på artikel 27 og 5 på artikel 35. Det medfører, at for hver ny stemme der afgives bliver tabellen 'updated' med stemme = stemme + 1.
Er det rigtigt opfattet? I så fald er der en en-til-en relation mellem tabellerne indhold og Stemmer. Du vil så kunne undvære en særskilt tabel for stemmer og i stedet tilføje et ekstra felt stemmer til tabellen indhold. Hvis du gør det, så kan du finde den artikel i hver kategori med flest stemmer således:
SELECT id, kategori, SUM(stemmer) FROM indhold GROUP BY kategori;
Hvis jeg har misforstået spørgsmålet eller den måde du bruger tabellerne, så forklar nærmere.
Det er rigtigt forstået. Ved ikke hvorfor jeg ikke havde tænkt på det. Jeg har nu ændret tabeller og sider, så der i indhold er et felt med total antal stemmer.
Bruger jeg SELECT id, kategori, SUM(stemmer) FROM indhold GROUP BY kategori; finder den godt nok artikler fra forskellige kategorier, men ikke dem med flest stemmer
Det var godt du kunne bruge min foreslåede tabelstruktur. I skynding fik jeg stukket en utilstrækkelig query ud. Ok, så står der 1 - 1. Lad os skynde os at gøre det 2 - 1. Denne query virkede i den test jeg stillede op:
SELECT i1.* FROM indhold i1 JOIN (SELECT kategori, MAX(stemmer) stemmer FROM indhold group by kategori) i2 ON i1.kategori = i2.kategori AND i1.stemmer = i2.stemmer
Med denne query får jeg max stemmer for hver kategori:
SELECT kategori, MAX(stemmer) stemmer FROM indhold group by kategori
Du lægger mærke til, at jeg giver MAX(stemmer) øgenavnet (alias) stemmer.
Resultatet af den query er en tabel. Den tabel joiner jeg med tabellen indhold. Da jeg således bruger tabellen indhold to gange er jeg, for ikke at forvirre mysql, nødt til at give de to versioner forskellige navne i1 første gang og i2 anden gang.
Jeg tillader mig at oprette dette som svar, idet jeg håber nu at have besvaret spørgsmålet.
Det virker helt fint, bortset fra, hvis alle artikler i en kategori har 0 stemmer, så bliver alle udskrevet. Kan der laves noget så den ikke henter dem som har 0 stemmer. prøvede lige med WHERE stemmer != '0' til slut, men det godtager den ikke. Jeg kan også bare lave en if($stemmer > 0) { //udskriv } men vil mene det er bedre at ordne det i sql.
For at få nullerne sorteret fra skal du søge efter
SELECT kategori, MAX(stemmer) stemmer FROM indhold group by kategori HAVING stemmer > 0
Og så gør du mig opmærksom på, at hvis der i en kategori er mere end en artikel der har højeste stemmer, altså hvis i kategori 3 både artikel 7 og artikel 8 har 32 stemmer hvilket er det højeste, så bliver alle skrevet ud. Det undgår du ved at gruppere det hele på kategori. Altså:
SELECT i1.* FROM indhold i1 JOIN (SELECT kategori, MAX(stemmer) stemmer FROM indhold group by kategori having stemmer > 0) i2 ON i1.kategori = i2.kategori AND i1.stemmer = i2.stemmer GROUP BY kategori
mange tak for hjælpen. Jeg vil godt have alle fra kategorien som har flest stemmer, så slettede GROUP BY kategori
Du har fået point
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.