Avatar billede klovnefisken Nybegynder
29. januar 2010 - 00:44 Der er 6 kommentarer og
1 løsning

sammen kæde 2 tabeller i en database

hej jeg er næsten ny i brug af mysql, det vil sige normale udtræk fra databaser med en tabel går ganske fint, men når jeg så vil have noget fra 2 tabeller, hvor et felt i den ene tabel giver et idnummer til tabel2 så har jeg et problem jeg ikke har kunne finde en løsning på
her er det jeg har forsøgt mig med, men der kommer kun en linje ud selvom jeg ved der er 5 styk id i besked, hvis jeg sletter søgningen i user tabellen virker alt, men så mangler jeg data
jeg er sikker på at den kode jeg forsøgte med giver et klart billed af hvad jeg skal bruge, men ikke har kunne løse selv

<?php
                       
echo " Beskeder til Admin <br><br>";
                       
// list beskeder til admin med den ældste øverst
                        include('../inc_filer/connect_db.php');
                       
$sql="SELECT * FROM besked ";
                        $result=mysql_query($sql,$forbindelse);
                       
while ($rows = mysql_fetch_array($result))
                       
{
                           
  if  ($rows['laes']=="nej")// der kommer senere en else på her
                           
  {
                                      $userid=$rows['id'];
                                      $sql1="SELECT * FROM user WHERE id=".$userid;
                                      $result1=mysql_query($sql1,$forbindelse);
                                      while ($rows1 = mysql_fetch_array($result1))
                               
    {
                                    echo"<a href=\"vis_besked.php?id=".$userid."\"> Besked nr:".$rows1['id']." fra ".$rows1['username']."</a><br />";
                               
    }
                           
  }
                       
}
                       
                   
?>

hvordan kan jeg ellers skrive denne ??
på forhånd tak Bruno
Avatar billede stinejh1980 Nybegynder
29. januar 2010 - 08:34 #1
Her er det i SQL:
SELECT Tabel1.Tabel1ID, Tabel1.Tabel1Text, Tabel2.Tabel2ID, Tabel2.Tabel2Text, Tabel2.Tabel1ID AS ForeignKey FROM Tabel1 INNER JOIN Tabel2 ON Tabel1.Tabel1ID = Tabel2.Tabel1ID

Det er INNER JOIN der forbinder de 2 tabeller.

Man kan også lave OUTER joins, men jeg tror det er dette du leder efter.

Ellers prøv at læse her:
http://www.w3schools.com/SQL/
29. januar 2010 - 08:45 #2
Det kan goeres nemmere, det vil sige hvis jeg har forstaaet problemet. 

Jeg gaar ud fra at du har brugere registreret med id og brugernavn i en tabel.  Brugere kan saa, paa en maade udenfor dette spoergsmaal, oprette beskedder der faar et beskednummer og bliver vist paa en side besked.php med beskednummer.  Samtidig bliver beskedden registreret i en tabel med beskednummer, id fra brugeren der oprettede det, og hvorvidt beskedden er laest eller ej.

Dit spoergsmaal er saa hvordan du paa en side kan skabe links til de ikke-laeste beskedder.

Har jeg forstaaet det korrekt?

I saa fald har jeg de foelgende forslag.  For at teste mine forslag lavede jeg to tabeller: (1) klovnefiskenUser med userid og navn.  (2) klovnefiskenBesked med id (= beskednummer), userid, og laes.  Fordi jeg regnede med at laes kun skulle have to vaerdier eftersom beskedden var laest eller ej lavede jeg vaerditypen boolean, altsaa med vaerdierne TRUE og FALSE. Jeg puttede et par vaerdier i tabellerne som jeg viser til sidst.

Jeg vil saa foreslaa at du laver en join query for beskednummer og bruger for ikke-laeste beskedder, for eksempel saaledes:

SELECT b.id, u.username FROM klovnefiskenBesked b JOIN klovnefiskenUser u ON b.userid=u.id
WHERE b.laes=FALSE

Den query indsaetter du i din php kode, og for hver raekke af resultatet laver du to variable $beskednr og $user, og de indsaetter du i din echo.

Den foelgende php kode gav mig disse tre links (i overensstemmelse med vaerdierne i mine tabeller):
Besked nr 2 fra userB
Besked nr 4 fra userB
Besked nr 6 fra userA

Jeg brugte denne kode:

<?
$link = mysql_connect (xxxx, yyyy, zzzz) or die(mysql_erorr());
mysql_select_db(qqqq) or die('Could not select database');

$sql="SELECT b.id, u.username FROM klovnefiskenBesked b JOIN klovnefiskenUser u ON b.userid=u.id
WHERE b.laes=FALSE";
$result=mysql_query($sql);
while($rows=mysql_fetch_array($result))
{
  $beskednr=$rows['id']; 
  $user=$rows['username'];
  echo '<a href="vis_besked.php?id="' . $id . '>Besked nr ' . $beskednr . ' fra ' .  $user . '</a><br/>';

mysql_close($link);
?>

Jeg har koden paa denne side som du er velkommen til at besoege: http://christianjorgensen.be/klovn.php

Du naevner ikke hvordan du saa vil markere i tabellen hvilke spoergsmaal er laest.  En maade kunne vaere efter at have trukket spoergsmaalene ud saa at lave saadan en query:  mysql_query("UPDATE klovnefiskenBesked SET laest=TRUE WHERE laest=FALSE");

Jeg haaber du kan bruge det.  Hvis jeg har misforstaaet problemet saa forklar.

Her er mine tabeller og vaerdier:

CREATE TABLE klovnefiskenBesked(id INT, userid INT, laes Bool);
INSERT INTO klovnefiskenBesked VALUES(1, 1, TRUE);
INSERT INTO klovnefiskenBesked VALUES(2, 2, FALSE);
INSERT INTO klovnefiskenBesked VALUES(3, 2, TRUE);
INSERT INTO klovnefiskenBesked VALUES(4, 2, FALSE);
INSERT INTO klovnefiskenBesked VALUES(5, 2, TRUE);
INSERT INTO klovnefiskenBesked VALUES(6, 1, FALSE);

CREATE TABLE klovnefiskenUser(id INT, username VARCHAR(10));
INSERT INTO klovnefiskenUser VALUES(1,'userA');
INSERT INTO klovnefiskenUser VALUES(2,'userB');
29. januar 2010 - 08:46 #3
Elvstine, dit svar kom mens jeg var i faerd med at udarbejde mit.  Vi synes stort set at vaere enige.
Avatar billede klovnefisken Nybegynder
29. januar 2010 - 20:08 #4
takker for de svar der er kommet, nu vil jeg kikke nermer på de besvarelser,
det er første gang jeg vil prøve at lave end "echo" linje ved at tage data fra 2 tabeller, men må da sige at de besvarelser i har givet ikke lige er til at gennemskue, det vil jeg bruge noget tid på så jeg lukker ikke denne tråd inden jeg har forstået det til bunds, så jeg ikke skal spørge næste gang, copy paste er ikke mig , jeg vil forstå hvad der sker
elvstine
elvstine  takker den adresse w3school, ser ud til at have mange gode ting
Christian den sql sætning du skriver kunne jeg godt tænke mig beskrevet mere i små step
og den måde du forstod min kode er ikke helt ved siden af
tabellen besked "afsender" indeholder "id" som jeg så skal bruge i tabellen "user" for at finde navn (senere flere ting), men ville lave det simpel i starten så det var til at lave og forstå.
hvad jeg ikke fortalte i mit første indlæg er at jeg går på skole som WEB integrator og er meget tæt på at være færdig med basis året , og skal starte på den vidre forløb efter påske.

håber da i (og andre) vil hjælpe mig gennem denne så alt er forstået
Avatar billede klovnefisken Nybegynder
29. januar 2010 - 20:54 #5
Christian, efter nermer eftersyn af din beskrivelse, er der en ting du har tænk lidt anderledes end jeg
besked tabellen felt "laes" kan have 3 muligheder (ja,nej,besvaret) derfor er det en tinytext (10) jeg har brugt og ikke kun en (true,false)
dit exempel på din hjemmeside rammer plet det er lige hvad jeg vil have som output, og efter man har trykket på linket kommer en ny side hvor mal læser beskeden, og ændre værdien til "ja" i tabellen , men den del har jeg fuld styr på.
29. januar 2010 - 22:26 #6
klovnefisken, jeg ser dine to indlaeg.  I #4 beder du om en beskrivelse af min foreslaaede sql saetning i smaa steps.  I #5 synes du saa, i mellemtiden, at have forstaaet mere.  Hvor smaa steps du taenkte paa og om det stadig er relevant ved jeg ikke, men lad mig forklare det foelgende.  Jeg opretter dette som et svar idet jeg mener at jeg saa har svaret paa dit spoergsmaal.  Efter din oplysning at laes kan have flere end to vaerdier aendrer jeg sql saetningen til SELECT b.id, u.username FROM klovnefiskenBesked b JOIN klovnefiskenUser u ON b.userid=u.id
WHERE b.laes="nej".

Jeg er ioevrigt enig med elvstine i at anbefale w3schools tutorials.  Dem har jeg selv haft megen glaede af.

Forklaring:

Mellem users og besked er der en en-til-mange relation.  Hver user kan have mange beskedder hvorimod en besked kun kan komme fra en user.  Fordi dine data derfor har to forskellige stukturer putter du dem i to forskellige tabeller, og saa faar du de to tabeller til at haenge sammen ved at hver besked har en userid der svarer til id'en for en user.

Naar du som nu har brug for data fra begge tabeller, saa joiner du dem.

Naar en SQL maskine joiner to tabeller saa laver den foerst, internt, en ny tabel der til hver linie i tabel 1 foejer alle linier i tabel 2.  Hvis tabel 1 har 12 linier og tabel 2 har 20 linier saa faar den interne tabel 240 linier.  Altsaa, i ovenstaaende query udfoerer SQL maskinen foerst "SELECT alt FROM klovnefiskenBesked JOIN klovnefiskenUser".

Derefter laeser SQL maskinen videre og ser at den fra den interne tabel kun behover de linier hvor userid i klovnefiskenbesked er lig med id i klovnefiskenUser.  Altsaa:  "SELECT alt FROM klovnefiskenBesked JOIN klovnefiskenUser ON klovnefiskenBesked.userid = klovnefiskenUser.id".  SQL maskinen sletter derfor for de overfloedige linier.

Men der er stadig for mange linier, for du har kun brug for de linier hvor laes = 'nej'.  Saa SQL maskinen reducerer tabellen yderligere ved at udfoere "..WHERE klovnefiskenBesked.laes = 'nej'.."

Omsider har du de linier du skal bruge, men du har ikke brug for alle kolonnerne, kun beskeddens id og user's navn, "SELECT klovnefiskenBesked.id, klovnefiskenUser.usernavn..."  Naar SQL maskinen har slettet de overfloedige kolonner bliver der til overs en tabel med kun to kolonner og kun de beskedder som din udvalgte user har lavet.  Det var saa den relationele del.

Saa for reducere skrivearbejdet tillader de fleste SQL maskiner at forkorte navnene paa tabellerne.  Foerste gang du naevner det fulde navn for klovnefiskenBesked giver du den det korte navn b (SELECT .... FROM klovnefiskenBesked b..) saaledes at du alle andre steder ikke behoever at skrive klovnefiskenBesked.userid men kan noejes med at skrive b.userid.  Tilsvarende forkorter du klovnefiskenUser til u.
Avatar billede klovnefisken Nybegynder
29. januar 2010 - 22:39 #7
christian
i den besvarelse du lige kom med var det jeg ikke forstod da jeg studerede den, de forkortelser du brugte , kunne jeg ikke finde hoved eller hale i, men nu kan jeg takker
sammen md de ting jeg har læst på den link i første svar (w3school) tror jeg at nu er den på plads, så nu vil jeg arbejde med at lave nogle forskellige vertioner og se om ikke jeg har fattet det rigtig
Takker
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