Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 17:55 Der 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

Kan I muligvis hjælpe
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 18:10 #1
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"
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 18:10 #2
: "...AND poll_check.NOGET=users.NOGET"
Avatar billede saucer Nybegynder
12. marts 2006 - 18:15 #3
Hvis du ikke vil have 3 gange peter så kan du vel bruge DISTINCT

Læs mere om det her : http://dev.mysql.com/doc/refman/5.1/en/distinct-optimization.html
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 18:17 #4
Jeg har ikke umiddelbart nogen sammenhæng mellem disse to tabeller. Undtagen poll_check.forfatterid og users.id, som ikke må være det samme.

Men jeg fik faktisk selv fikset den. Når jeg skriver SELECT DISTINCT virker det.
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 18:17 #5
Okay, saucer får pointene. Men tak til erikjacobsen også!
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 18:20 #6
Nå ja ;)  Hvis du kører mysql 4.1 eller nyere kan det anbefales at bruge en subselect.
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 18:25 #7
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?
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 18:37 #8
en subselect - bruger du mysql 4.1 eller nyere?
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 19:00 #9
Nej, desværre ikke :(

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?
Avatar billede saucer Nybegynder
12. marts 2006 - 19:15 #10
Det er noget af en skummel løsning som du har fat der. hhe

men hvis du vil have dine point så kan du bare klikke her : http://www.eksperten.dk/spm/694560
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 19:15 #11
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
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 19:16 #12
Omvendt, ja, ikke "NOT NULL", men "NULL"  til sidst
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 19:19 #13
Ok, da, helt korrekt:  ....AND poll_check.forfatterid IS NULL
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 19:56 #14
Den udfører kommandoen korrekt, men den finder ingen rækker :(
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 19:59 #15
Hvad indeholder poll_check?
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 20:03 #16
Det er sjovt du spørger, for når jeg fjerner denne:
AND poll_check.pollid='14'

Virker det fint.

Det bliver dog et problem når der er flere afstemninger end blot denne ene...

Poll check indeholder et afstemningsid og et forfatterid. For at holde styr på hvem der allerede har stemt i hvilke afstemninger.

CREATE TABLE poll_check (
  pollid int(5) NOT NULL default '0',
  forfatterid int(5) NOT NULL default '0'
) TYPE=MyISAM;

INSERT INTO poll_check VALUES (16, 89);
INSERT INTO poll_check VALUES (14, 109);
INSERT INTO poll_check VALUES (14, 1);
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 20:22 #17
Ja, klart nok. Det ville være noget nemmere med en subselect. Hvad betyder users.ariske ?
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 20:58 #18
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...)
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 21:07 #19
Hvis der ikke er nogen anden udvej kan jeg vel gøre noget i denne stil:
SELECT forfatterid FROM poll_check where pollid='14'.

Så får jeg alle id'er og disse kunne sættes ind i en ny SQL sætning:

SELECT nick FROM users WHERE gruppe='gym' AND ariske='ja' AND id!='3' AND id!='7' AND id!='33' osv.

Måske jeg skulle gøre sådan?
Avatar billede erikjacobsen Ekspert
12. marts 2006 - 21:12 #20
Hmm, lyder ikke rart. Så er jeg nok ikke den rette til at hjælpe dig.
Avatar billede phpbegynder2004 Nybegynder
12. marts 2006 - 21:44 #21
Ved ikke hvor god kode det er, men det virker...

$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.
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