webForumDet fria alternativet

Invecklad summering

8 svar · 380 visningar · startad av Mossa

MossaMedlem sedan dec. 200123 inlägg
#1

Hej!

Jag har klurat på den här länge nog nu utan att komma fram till en tillräckligt bra lösning. Kanhända måste jag lösa det på mitt omständiga vis, men jag är nyfiken på om jag har missat någon optimerad lösning. Finns den är jag övertygad om att SQL-gurusarna här kommer kläcka den! :)

Jag har en MySQL-tabell för betygsättning av bilder, med tre aktuella fält: bild, användare och betyg. Betyg innehåller heltal 1 eller -1, användare talar om från vem betyget kommer och bild vilken bild betyget avser. Jag avser att summera betyget för en viss bild. Klurigheten är att en användare kan ha många betyg i databasen - för samma bild. Det är dock endast ett dåligt (-1) och ett bra (1) betyg som skall summeras per användare. Vilket bra eller dåligt betyg i ordningen som summeras spelar ingen roll.

Några förslag?

MossaMedlem sedan dec. 200123 inlägg
#2

Ovanstående var kanske en dålig beskrivning av vad jag ville åstadkomma. Detta förtydligar förhoppningsvis:

------------------------
bild | anvandare | betyg
------------------------
20 | 2 | -1
20 | 2 | -1
20 | 2 | 1
20 | 4 | 1
20 | 4 | -1
20 | 6 | 1
20 | 7 | 1
------------------------

Ovanstående skall efter summering alltså ge totalbetyget 2 för bild 20 (-1 + 1 + 1 + -1 + 1 + 1 = 2)

SELECT SUM(temp.betyg)
FROM (

    SELECT DISTINCT anvandare, betyg
    FROM tabell
    WHERE bild = 20
    AND betyg = 1

) AS temp
SELECT SUM (temp.betyg)
FROM (

    SELECT DISTINCT anvandare, betyg
    FROM tabell
    WHERE bild = 20
    AND betyg = -1

) AS temp

Detta fungerar, men jag skulle gärna göra hela uträkningen i SQL-frågan direkt istället för att få värden från två frågor att sen behandla ...

doggelitoMedlem sedan juni 20003 076 inlägg
#3

så här kanske!? :)

SELECT anvandare, sum(betyg)
    FROM tabell
    	WHERE bild = 20
		GROUP BY anvandare
LarsGMedlem sedan dec. 200012 464 inlägg
#4
SELECT SUM(betyg)
FROM (
    SELECT DISTINCT anvandare, betyg
    FROM tabell
    WHERE bild = 20
 ) AS dt

Varför flera betyg per användare?

MossaMedlem sedan dec. 200123 inlägg
#5

Doggelito: Nej, det blir inte riktigt rätt. Då summerar den alla betyg uppdelat per användare. Dvs resultatet från min ovanstående exempeltabell skulle bli ungefär:

Användare | Summa
-------------------
2 | -1
4 | 0
6 | 1
7 | 1

Och det är inte vad jag vill uppnå. Jag vill för det första summera alla betyg till en summa, inte uppdelat per användare. För det andra skall frågan dessutom enbart räkna max ett bra respektive ett dåligt betyg från varje användare ...

MossaMedlem sedan dec. 200123 inlägg
#6

Lars: Anledningen till flera betyg är att bilden kan redigeras efter kritik, och därmed få nytt betyg från samma "kritiker" (användare). Detta ska dock inte påverka ursprungliga betyget.

För övrigt fungerar din fråga bra ja, om det hade räckt med att räkna ett betyg från varje användare, men jag vill räkna max ett dåligt OCH ett bra från varje användare, därav kruxet (och två frågor som jag hade i mitt exempel ovan).

Går det inte att lösa i en enkel fråga så får jag väl köra på två, men jag var nyfiken om någon hade några idéer. Jag förstår för övrigt om detta betygssystem låter underligt men det är så det kommer fungera :r

doggelitoMedlem sedan juni 20003 076 inlägg
#7

Mossa skrev:

Nej, det blir inte riktigt rätt. Då summerar den alla betyg uppdelat per användare

Sorry, läste inte ditt första inlägg så noga!

Mossa skrev:

Jag förstår för övrigt om detta betygssystem låter underligt...

Japp, det låter underligt!
Har man redigerat en bild så borde den väl räknas som en ny bild och därmed få nya betyg.
Men det är ditt system! :)

(LarsG fixar nog satsen åt dig, det brukar han göra! ;) )

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Jag förstår nog inte problemet.

Om du använder den inre frågan

SELECT DISTINCT anvandare, betyg
    FROM tabell
    WHERE bild = 20

så blir resulatet

20 | 2 | -1
20 | 2 | 1
20 | 4 | 1
20 | 4 | -1
20 | 6 | 1
20 | 7 | 1

vilket innehåller högst ett dåligt och högst ett bra betyg per användare för denna bild. Summan av betygen i detta resultat blir då 2 som du förväntade dig,

MossaMedlem sedan dec. 200123 inlägg
#9

Lars: Tack! Förlåt mitt tidigare svar, jag fick för mig att DISTINCT skulle plocka ut endast på unik användare, inte använda sig av både användare och betyg tillsammans som unik kombination. Så visst fungerade det utmärkt. :D

Frågan blev alltså tillslut:

SELECT SUM(betyg) 
FROM (

    SELECT DISTINCT anvandare, betyg
    FROM tabell
    WHERE bild = 20

) AS temp
133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)