Avatar billede michaeltryl Seniormester
20. maj 2012 - 15:55 Der 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)
20. maj 2012 - 17:05 #1
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.
Avatar billede michaeltryl Seniormester
20. maj 2012 - 18:30 #2
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
20. maj 2012 - 21:22 #3
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
20. maj 2012 - 21:33 #4
...forklaring:

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.
Avatar billede michaeltryl Seniormester
20. maj 2012 - 22:47 #5
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.
21. maj 2012 - 07:57 #6
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
Avatar billede michaeltryl Seniormester
21. maj 2012 - 14:29 #7
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
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