08. august 2005 - 20:57Der er
13 kommentarer og 1 løsning
Hente fra en tabel og sortere efter en anden
ok, helt "enkelt" er det jeg skal, men ikke kan finde ud af, er at sortere et udtræk fra en tabel efter hvor god en karakter "udtrækket" har fået i en anden tabel.
Jeg har en tabel med pigerne, som bliver kaldt Kodet, og så har jeg en tabel med ip'erne der stemmer på pigerne, kaldt Kodetip, hver gang man stemmer på en piger, bliver ens ip, den karakter men gav pigen, og id'en på den pige man stemte på gemt i Kodetip.. Så det der skal ske er at den skal finde alle tråde i tabellen Kodetip med samme "idet" og så ligge dem sammen og dividere med hvor mange den har fudet.
Det vil sige hvis den finder 5 indlæg hvor idet er 3 og hvor alle 5 vote er 4, så skal den skrive ud at ID 4 har (4+4+4+4+4)/5 i karakter
og derfor skal sorteres over dem dem er har under 4....
mine tabeller: CREATE TABLE Kodetip ( id int(11) NOT NULL auto_increment, ip varchar(255) NOT NULL, idet int(9) NOT NULL, vote int(2) NOT NULL, PRIMARY KEY (id) );
CREATE TABLE Kodet ( id int(9) NOT NULL auto_increment, Navn varchar(50) NOT NULL, Placering int(4) NOT NULL, Stemmer int(9) NOT NULL, MSN varchar(250) NOT NULL, Tekst longtext NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
jeg bruger lige nu denne her til at udskrive kodet:
$query = mysql_query("select * from Kodet order by $sort desc limit $i,$delt") or die(mysql_error());
den skal jo så bare sorteres efter deres karakter. Håber jeg har gjort det klart nok, har selv prøvet lidt med sql join, men kan ikke helt få det til at virke.
Skal du så ikke bare ændre din $query variabel til noget lignende dette?:
$query = mysql_query("select Kodet.Navn, SUM(IFNULL(Kodetip.vote, 0)) / COUNT(*) AS Gennemsnit from Kodet LEFT JOIN Kodetip ON Kodet.id=Kodetip.idet GROUP BY Kodet.Navn order by SUM(IFNULL(Kodetip.vote, 0)) / COUNT(*) desc limit $i,$delt") or die(mysql_error());
Hvis du har medtaget flere felter, som ikke er en del af aggregat funktioner (funktioner, som bruges ifbm. GROUP BY, som f.eks. MIN, MAX, SUM, COUNT mv.), har du forhåbentlig husket at tilføje disse i din GROUP BY også. Hvis man bruger aggregat funktioner, skal alle andre felter du har medtaget i din SELECT sætning også angives i GROUP BY, ellers fremkommer den fejlmelding du refererer til.
Okay! Ja, jeg havde ikke været opmærksom på, at det var id, du brugte. Men du kan godt medtage flere felter en Navn, bare du så også husker at placere dem i GROUP BY også. F.eks. hvis du både vil have Kodet.Id og Kodet.Navn med:
$query = mysql_query("select Kodet.Id, Kodet.Navn, SUM(IFNULL(Kodetip.vote, 0)) / COUNT(*) AS Gennemsnit from Kodet LEFT JOIN Kodetip ON Kodet.id=Kodetip.idet GROUP BY Kodet.Id, Kodet.Navn order by SUM(IFNULL(Kodetip.vote, 0)) / COUNT(*) desc limit $i,$delt") or die(mysql_error());
Har også prøvet at lave om så der ikke står Kodet.Id men Kodet.id, men det hjalp heller ikke, tænkte det måske betød noget når det jo står med småt i tabelen.
Hov, jeg ser nu, at du snakker om feltet ip som der hvor karakteren gives, hvor jeg har summeret på feltet vote. Hvad er det rigtige? Vote er numerisk, og egner sig dermed til beregninger, mens ip er et variabelt char felt, som ikke egner sig til beregninger.
Nu har jeg prøvet at oprette dine tabeller, og kørt min sql i PhpMyAdmin, og den gav rigtigt nok den fejl du angav. Det hjalp gevaldigt, da jeg rettede værdien i ORDER BY til simpelthen Gennemsnit:
$query = mysql_query("select Kodet.Id, Kodet.Navn, SUM(IFNULL(Kodetip.vote, 0)) / COUNT(*) AS Gennemsnit from Kodet LEFT JOIN Kodetip ON Kodet.id=Kodetip.idet GROUP BY Kodet.Id, Kodet.Navn order by Gennemsnit desc limit $i,$delt") or die(mysql_error());
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.