Anmäl dig till Roborock Challenge!
Permalänk
Medlem

MySQL group by() problem.

Hej hoppas det finns någon vänlig själ som kan hjälpa mig med en sql fråga? Jag har en länksmaling där användarna ska kunan rösta på de olika länkarna om vad de tyckte, rösterna sparas i en annan tabell där användarens röst och namn har sparats för att slippa dubbel röster.

Men om fler länkar inte har röster så kommer det bara upp ett av altenativen fram. Jag vill ju självklart att alla länkar ska komma fram. Så det är bara att den gruperar alla som har värdet "NULL" i ´Rating. har två länkar samma betyg så kommer båda att visas.

Så här ser frågan ut om det är någon hjälp:

SELECT `LINK`.*, AVG(`LINKVOTE`.`Rating`)*100 AS Rating FROM `LINK` LEFT JOIN `LINKVOTE` ON (`LINK`.`Name` = `LINKVOTE`.`Link`) WHERE ((`link`.`Aproved` = 1)) GROUP BY (`LINKVOTE`.`Link`) ORDER BY `Name` ASC;

Har någon en ide, men inte är helt säkra, så blir jag glad om ni skriver er ide. Vem vet? Det kan ju fungera!

Visa signatur

O o
/¯¯/_o___o___o___o____o__
\__\¯¯o¯¯¯o¯¯¯¯¯¯o¯¯¯¯¯¯o I'M FIREIN MY LAZER!

Permalänk
Medlem

En idé jag får är att MSSQL-motorn fungerar på så sätt att alla JOIN tolkas först, efter det körs WHERE och så vidare. Det får till följd att man omedvetet kan råka filtrera bort resultat fastän man ville ha med alla NULL-värden. Det jag inte vet är om MySQL-motorn gör på samma sätt, men du kan ju enkelt kolla genom att se om du får med alla resultat (alla länkar i detta fall) genom att ta bort WHERE-satsen. I så fall får du ändra syntax till att göra en filtrering i JOIN istället för i en WHERE, alltså såhär:

SEL ... LEFT JOIN linkvote ON link.name = linkvote.link AND link.approved = 1 GRO ...

Permalänk
Medlem

Fungerar det alltså utan group by? Om det fungerar utan group by så prova distinct istället...

om det inte fungerar med group by så tror jag att felet ligger i din avg-funktion. Prova att använda ifnull också...

Permalänk
Medlem

Inte riktigt säker på vad du vill göra. Kan du ge exempel på resultat du får, och resultat du skulle vilja ha?

Kan för övrigt rekommendera att du skapar en kolumn i "link" där du sparar medlet varje gång en röst läggs till. Att ta AVG på alla röster varje gång kommer kräva onödigt mycket prestanda.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Drenmi
... Kan för övrigt rekommendera att du skapar en kolumn i "link" där du sparar medlet varje gång en röst läggs till. Att ta AVG på alla röster varje gång kommer kräva onödigt mycket prestanda.

Citat:

Ursprungligen inskrivet av Donald Knuth
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.

Seriöst. AVG tar inte så mkt prestanda. Ifall det visar sig att prestandan är oacceptabel med AVG (efter att man har faktiskt gjort mätningar som visar att så är fallet), då är det läge att optimera.

azoapes lösning borde annars fungera.

Permalänk
Medlem

Jag har hittat felet.
azoapes sätt testatde jag men det hjälpte inte. Men det ser vettigare ut. så jag behåller det så.
Det var att jag gruperade efter tabellen som jag joinade (får man lov att utrycka sig med sådan svengelska?). Hade några röster så resulterade det i att den inte hade något sorfera efter eftersom det värdet ej fanns... Då ändrade jag den till att sorera efter den primära nycklen i link, då funkade det.

Många tack för förslagen! Det uppskattas att ni tog av er tid för att fundera över mitt problem!

Visa signatur

O o
/¯¯/_o___o___o___o____o__
\__\¯¯o¯¯¯o¯¯¯¯¯¯o¯¯¯¯¯¯o I'M FIREIN MY LAZER!

Permalänk
Medlem

en alternativ lösning vore att flytta upp/ut uträkningen:

SELECT link.*, (select AVG(rating)*100 from linkvote where linkvote.link = link.name group by link) as rating where link.approved = 1 order by name asc

(iaf går det o göra så i mssql, har inte mysql här så jag kan testa)