Avatar billede ny89 Nybegynder
14. november 2011 - 12:47 Der er 17 kommentarer og
2 løsninger

Relationer

Hvordan får jeg lavet en relation mellem to tabeller?

Har følgende fire tabeller:
Tabel brugere: brugere_id, navn, brugernavn ....
Tabel kommentar: kommentar_id, kommentar, klokken,
Tabel Adresse: adresse_id, Adresse [DENNE TABEL VIL JEG IKKE BRUGE NU]
Tabel: Foreign key til brugere_id og kommentar_id [RELATIONSTABEL]

Mit store spørgsmål er, hvordan man f.eks. kan lave en select, join forbindelse el.lign. til at en bestemt brugere_id skriver noget og kommentaren fra den bestemte person bliver vist??
Avatar billede arne_v Ekspert
14. november 2011 - 14:16 #1
Du kan altid lave en join:

SELECT * FROM tabel1 JOIN tabel2 ON tabel1.felt=tabel2.felt

En foreign key constraint virker kun med InnoDB tabeller - syntaxen er her:

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

Men start med normal join.
Avatar billede ny89 Nybegynder
14. november 2011 - 14:32 #2
Okay, vil jeg prøve :) skal der stå brugere_id i stedet for felt?

Ja, bruger InnoDB og har anvendt foreign key, men ved egentlig ikke hvad man gør efterfølgende.
Avatar billede arne_v Ekspert
14. november 2011 - 14:48 #3
felt skal erstattes af de felter som skal vaere ens i join'en
Avatar billede ny89 Nybegynder
14. november 2011 - 14:56 #4
Får den her meddelelse, når jeg prøver at indtaste det:
"MySQL returned an empty result set (i.e. zero rows)".

Via den sætning burde databasen vide, hvilken bruger der skriver den bestemte kommentar, som bliver udskrevet?

mine to id indeholder primary key og auto_increment - ved ikke om det har en betydning.
Avatar billede arne_v Ekspert
14. november 2011 - 15:04 #5
Hvordan ser din SQL saetning ud?
Avatar billede ny89 Nybegynder
14. november 2011 - 15:10 #6
SELECT * FROM brugere JOIN kommentar ON brugere.brugere_id=kommentar.kommentar.id
Avatar billede ny89 Nybegynder
14. november 2011 - 15:21 #7
Skal man måske blande noget php med i, for at identificere id?
Avatar billede arne_v Ekspert
14. november 2011 - 15:24 #8
kommentar.kommentar.id

ser forkert ud

kommentar.bruger_id

maaske??

Eller maaske skal du have din 3. tabel joinet med ind??
Avatar billede ny89 Nybegynder
14. november 2011 - 15:27 #9
når ja, har lige rettet det. :) Men det hjalp heller ikke.

Hvordan kan man få den 3. tabel med?
Avatar billede arne_v Ekspert
14. november 2011 - 16:34 #10
SELECT *
FROM (tabel1 JOIN tabel2 ON tabel1.felt=tabel2.felt) JOIN tabel3 ON tabel2.felt=tabel3.felt
Avatar billede ny89 Nybegynder
14. november 2011 - 16:57 #11
MYSQL kommer med samme meddelelse: "..empty result". :/ Forstår ikke hvorfor.

Når man laver en relationstabel, er det så nok med at lave foreign key til brugere_id og kommentar_id? Eller har jeg glemt noget?
Avatar billede ny89 Nybegynder
14. november 2011 - 17:08 #12
Jeg anvender PhpMyAdmin og hvis jeg under "INSERT funktionen" indsætter data fra mine to andre tabeller, så vil den gerne lave en JOIN. Men det kan ikke passe at man skal hive data ind i relationstabellen manuelt??
Er det ikke netop derfor man laver en relationstabel, for at hive data ud på en nemmere måde?
14. november 2011 - 19:03 #13
(arne_v, jeg havde andetsteds aftalt med ny89 at deltage i tråden.  Derfor blander jeg mig, skønt du er godt igang.)

ny89, må jeg spørge dig hvordan du bruger dine data.  Jeg vil gætte på, at en bruger kan lave mange kommentarer, men at en kommentar kun kan komme fra en enkel bruger.  Det vil aldrig kunne forekomme, at en kommentar er lavet af flere forskellige brugere, er det korrekt?  I så fald har du en såkaldt en-til-mange relation mellem brugere og kommentarer.  Det med de tre tabeller er normalt den rigtige løsning for mange-til-mange relationer, så som hvis det drejede sig om brugere og de aviser de læser.  Hver bruger kan læse mange aviser og hver avis kan læses af mange brugere.

Under forudsætning af en en-til-mange relation vil jeg foreslå at skippe den tredje tabel og bruge to tabeller såsom:

bruger
id navn o.s.v
1  Hans  --
2  Jens  --

kommentar
id brugerid datotid kommentar
1      1      '2011-11-11 12:13:14'  'Der var engang en mand'
2      2      '2011-11-12 13:14:15'  'Han boede i en spand'
3      2      '2011-11-12 16:17:18'  'Og spanden var af ler'

Så bruger1 har lavet en kommentar og bruger 2 har lavet to kommentarer.

Hvis du så vil have udskrevet navn, datotid, og alle kommentarer for bruger 2 siger du:

SELECT navn, datotid, kommentar FROM bruger JOIN kommentar ON bruger.id = kommentar.brugerid

Så skulle du få dette:

Jens 2011-11-12 13:14:15 Han boede i en spand
Jens 2011-11-12 16:17:18 Og spanden var af ler


Det var ikke det du spurgte om, men muligvis kan det hjælpe dig i retning af det du behøver.
Avatar billede ny89 Nybegynder
14. november 2011 - 19:13 #14
Hej Christian_belgien, tak fordi du vil deltage i tråden.

Hvorfor skal brugerid med og hvilke(n) datatyper skal den have?

Hvordan vil du echo sætningen?
14. november 2011 - 19:50 #15
Spørger du hvorfor brugerid skal med i kommentar tabellen?  Det er for at vide hvilken bruger der har lavet kommentaren.  Eller mente du noget andet?

Så spørger du, hvordan man kan echo'e sætningen.  Jamen så er vi ikke længere i mysql, så er vi ovre i applikationen som velsagtens er i php.  Lad os antage, at du indretter tabellerne som foreslået i #13 og du på en php side vil have udskrevet det i #13, så kunne du gøre dette:

$result = mysql_query("SELECT navn, datotid, kommentar FROM bruger JOIN kommentar ON bruger.id = kommentar.brugerid WHERE navn = 'Jens'");
while($row = mysql_fetch_array($result)) echo $row['navn']." ".$['datotid']." ".$row['kommentar']."<br>";
Avatar billede ny89 Nybegynder
14. november 2011 - 21:06 #16
I må gerne sende et svar begge to. Så får I 50 point hver. Tak for hjælpen.
14. november 2011 - 21:19 #17
Svar fra mig.
Avatar billede ny89 Nybegynder
14. november 2011 - 21:20 #18
Kan man ikke give halvdelen af pointene til hver af jer?
Avatar billede arne_v Ekspert
15. november 2011 - 00:41 #19
jo

men jeg skal foerst ogsaa smide et svar

hermed gjort
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
Computerworld tilbyder specialiserede kurser i database-management

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