Avatar billede LilleUdvikler Nybegynder
16. august 2011 - 17:27 Der 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.

Hvad kan man så gøre? :-S
Avatar billede jetobi Juniormester
16. august 2011 - 17:33 #1
Evt istedet for at have 2 tabeller i den database, så brug en, i en tabel kan du godt have post, post_answer, ? du behøves ikke dele den op?
Avatar billede LilleUdvikler Nybegynder
16. august 2011 - 17:44 #2
Og hvordan ville du gøre det?
Avatar billede niklask Nybegynder
16. august 2011 - 18:04 #3
Du kan lave en tabel med alle posterne i, hvor du har sendtTil og sendtFra.

SQL:
SELECT * FROM Posts WHERE sendtFra='$user' OR sendtTil='$user'
16. august 2011 - 18:04 #4
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")
16. august 2011 - 18:08 #5
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.
Avatar billede jetobi Juniormester
16. august 2011 - 18:09 #6
ja, bare lav en tabel med, sendtfra, sendttil, hvornår og alle de informationer du skal bruge :)
Avatar billede jetobi Juniormester
16. august 2011 - 18:15 #7
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 :)
Avatar billede LilleUdvikler Nybegynder
16. august 2011 - 18:56 #8
Jeg vil gerne kunne nøjes med 1 tabel.

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.

- Hvordan laver jeg det nu?
Avatar billede niklask Nybegynder
16. august 2011 - 20:07 #9
Christian_Belgien, hvordan kan du skrive præcis det samme som jeg, når jeg ikke sendte beskeden? Jeg viste kun min besked som preview.
16. august 2011 - 20:00 #10
Du laver en tabel, lad os kalde den for tblBeskeder:

id
besked
sendtFra
sendtTil
dato

For at få vist beskederne som din bruger har skrevet eller modtaget, bruger du denne sætning:

SELECT * FROM tblBeskeder WHERE sendtFra='$user' OR sendtTil='$user'
16. august 2011 - 21:02 #11
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.
Avatar billede vagnk Juniormester
16. august 2011 - 21:55 #12
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.

v
Avatar billede LilleUdvikler Nybegynder
16. august 2011 - 22:05 #13
Jeg vil gerne sige tak til alle som har skrevet herinde. Jeg har samlet det hele i en tabel. Og det fungere fint, som det skal.

- Det behøver heldigvis ikke være så avanceret. Det er en lille del af det site jeg er i gang med at lave.

Christian, kan du ikke smide et svar? :)
16. august 2011 - 22:07 #14
Svar fra mig.
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