16. august 2011 - 17:27Der er
13 kommentarer og 1 løsning
SELECT * fra 2 tabeller.
Hejsa.
Jeg er i gang med et PB system. Hvor man kan sende beskeder til hinanden, og svare på beskederne. Man har en Indbakke, hvor man skal kunne se "main beskeder" og "svar beskeder". Dvs. man skal kunne se alle beskeder send til en selv. På samme side.
Altså ikke en side til svar og en side til main beskeder.
Mine main beskeder er i en tabel og svar er i en anden.
Her opstår mit problem: Jeg skal have alle rows fra henholdsvis: post og post_answer, WHERE to_user='$user'.
Jeg har prøvet:
$sql = mysql_query("SELECT * FROM post,post_answer WHERE to_user='$user'")or die(mysql_error());
Men det kan man åbenbart ikke. En INNER JOIN fungerer ikke - da den kun vælger rows der har samme værdi.
Hvordan er tabellerne opbygget? Nu gætter jeg, at post (mindst) har en kolonne med en id, en kolonne for user, og en kolonne for beskedden. Videre gætter jeg, at post_answer (mindst) har kolonnerne id, to_user, og besked. Hvis så der i post er fem beskedder med user 'ole' og der i post_answer er tre beskedder med to_user = 'ole' og $user = 'ole', så vil du have, gætter jeg, 8 beskedder skrevet ud, først de fem post og derefter de tre post_answer.
Hvis det alt sammen er rigtigt gættet, så skulle denne query give dig det:
$sql = mysql_query("SELECT id, besked FROM post WHERE user = $user UNION SELECT id, besked FROM post_answer WHERE to_user = $user")
Nå, niklask fik sit indlæg ind mens jeg skrev mit. Mit svar gik på din oprindelige problemstilling hvor du har valgt at have to forskellige tabeller. Jeg giver de andre indlæggere ret i, at det må kunne klares i en tabel. Hvis du giver strukturen af de to tabeller og lidt mere om, hvordan du bruger det, vil det være nemmere at foreslå konkrete løsninger med en enkelt tabel.
lige nu sover jeg, ikke bruge hvornår fordi mysql bruger ikke bogstaverne "åøæ" så det vil ikke virker, så tid istedet for :) men håber du forstår hvad jeg mener :)
Jeg har bare et problem, og det er at man skal kunne svare på hinandens beskeder. Det var egentlig derfor jeg havde 2 tabeller, hvor den ene var med svar, og den anden var bare rod beskederne.
niklask, min uforbeholdne undskyldning - det var en fejl, en af mine ti tommelfingre landede på den forkerte knap. For LilleUdvikler og alle: #9 er niklask's indlæg som stod i preview men som jeg fik skudt af og så kom til at stå i mit navn. Coadmin (hvis du ser det:) Det er vel egenlig en utilsigtet 'feature': niklask havde lavet en preview som var synlig for mig (og sandsynligvis for alle), og ved at jeg trykkede på knappen (hvad jeg ikke skulle have gjort) blev indlægget fyret af under mit navn. Jeg ville have troet at previews kun skulle være synlige for den der lavede dem.
Christian_Belgien løsning er god nok hvis du vil have dem ud efter hinanden.
Nu er det lidt af et problem at vi alle skal gætte hvordan dine tabeller ser ud, men hvis jeg skal fortsætte i Christian_Belgiens bane med to tabeller med hhv 3 og 5 records kan du lave noget i retning af : SELECT id, post.besked, post_answer.besked FROM post JOIN post_answer ON post.id = post_answer.id WHERE ???
Det vil give dig 5 rækker. JOIN kan være LEFT eller INNER afhængig af hvilken tabel der skal være de bærende. Det betyder at du kan skrue din JOIN sammen sådan at du får 3 rækker fra "post" hægtet sammen med 3 rækker fra "post_answer" hvor betingelserne passer ("post" er den bærende) eller du kan få de 5 rækker i "post_answer" hægtet sammen med med de 3 rækker fra "post" ("post_answer" er bærende.
Den viste simpel join kunne skrives som: SELECT ... FROM post, post_answer WHERE post.id = post_answer.id AND...
At joine kan være lidt tungt at få fat i, men når man har det, kan man lave virkelig elegant kode. Ofte ser man programmører der sender en query afsted og derefter sender en query for hver række han modtager for at få detaildata fra en anden tabel. Den slags råber og skriger på joining.
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.