12. marts 2006 - 17:55Der er
20 kommentarer og 1 løsning
Join i php
Hej,
Jeg har et afstemningsscript og ønsker nu at se, hvilke brugere der ikke har stemt. Jeg har en tabel med alle brugere kaldet users.
Så har jeg en tabel kaldet poll_check, hvor afstemningsid bliver smidt ind og et forfatterid (kaldet id i tabellen users).
Nu vil jeg gerne finde ud af, hvilke brugere der ikke har stemt:
$hent = mysql_query("SELECT users.nick FROM poll_check, users WHERE users.ariske='ja' AND poll_check.pollid='13' AND users.gruppe='gym' AND poll_check.forfatterid!=users.id");
Jeg får et fint resultat. Desværre bliver det ganget op, med antallet af rækker i poll_check.
Så hvis tre brugere har stemt (og der derved er tre rækker i poll_check) vil jeg få et tredobbelt resultat. F.eks. Følgende personer ikke har stemt: Peter Peter Peter Thomas Thomas Thomas
Når du laver en join mellem 2 tabeller, poll_check og users, skal du (næsten) altid have en sammenligning mellem 2 felter i de to tabeller, så udvid din sql-sætning med: "...AND poll_check.NOGET=users=NOGET"
Ups nej. Nu har jeg klokket i det. Det virker faktisk ikke.
Hvis jeg fjerner DISTINCT igen, så får jeg dobbelt op på resultater, hvis der er to der har stemt (da der herved vil være 2 rækker inde i poll_check). Der er dog ikke præcis dobbelt så mange resultater. Det er kun de personer der ikke har stemt, som der er dobbelt af. Hvis Peter har stemt vil han nemlig stadig så der, men kun én gang.
Hvis jeg sætter distinct på igen, vil jeg få vist alle brugere undtagen ham der stemte først. Så hvis der er er 30 brugere ialt og 10 faktisk HAR stemt, vil den vise at 29 brugere ikke har stemt. Hmm. Hvordan løses dette?
Er der ikke andet at gøre? Jeg ville da ikke tro, at det var en meget anvanceret funktion at udvælge alle rækker i tabel-1, på nær dem der allerede står i tabel-2. Eller er jeg helt galt på den?
Nej, det er principielt svært at lede efter noget, der ikke er der ;)
Hvorfor bruger du ikke en nyere mysql?
Men ok, vi kan bruge en left join. Prøv at se hvad der kommer ud af den her:
SELECT users.nick FROM users LEFT JOIN poll_check ON poll_check.forfatterid=users.id WHERE users.ariske='ja' AND poll_check.pollid='13' AND users.gruppe='gym' AND poll_check.forfatterid NOT NULL
Jeg har et brugersystem med fem forskellige grupper (derfor gruppen gym). I gruppen gym har kun de "ariske" ret til at stemme. (Lidt underligt system, ved det godt...)
$hent_forfatterid=mysql_query("SELECT forfatterid FROM poll_check WHERE pollid='$_GET[missing]'"); $var ="SELECT nick FROM users WHERE "; while($row=mysql_fetch_assoc($hent_forfatterid)){ $var.= "id!='$row[forfatterid]' AND "; } $var.= "gruppe='$gruppe' AND ariske='ja' ORDER BY nick";
$hent_navne=mysql_query("$var");
Men tak for hjælpen! Hvis du vil have lidt point, så har saucer oprettet et spm.. Du kunne jo med god samvittighed tage halvdelen og så kunne saucer beholde resten.
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.