Avatar billede fancy Mester
02. april 2010 - 11:39 Der er 12 kommentarer og
1 løsning

Join ??

Hej

jeg 2 tabeller som jeg skal hente data ud af 

den ene heder arrdb =arrangement den anden hedder tilmldb som indeholder person

nu vil jeg gerne kunne se kollone "adag" fra arrdb men også alle de andre data fra tilmldb



jeg har prøver dette men det virker ikke

jeg trode at jeg så hentede alle data fra begge tabeller og der efter kunne hive dem ud med [row]


$result = mysql_query("SELECT * FROM tilmdb WHERE arrid='$aid', arrdb where tilmid='$tid'")
or die(mysql_error());
02. april 2010 - 12:02 #1
Hvordan haenger de to tabeller sammen?  Er der for eksempel i arrdb et felt ID og er der i tilmdb et felt arr_ID saaledes at tilmeldingerne til et arrangement har arr_ID svarende til ID'en fra arrdb?

I saa fald, hvis du vil have adag plus alle oplysningerne fra tilmldb der hoerer til den adag saa bliver din query denne:

SELECT arrdb.adag, tilmldb.*
FROM arrdb JOIN tilmldb ON arrdb.ID = tilmldb.arr_ID.
Avatar billede michael_stim Ekspert
02. april 2010 - 12:10 #2
$result = mysql_query("SELECT a.adag, t.* FROM tilmdb t, arrdb a WHERE a.arrid='$aid' AND t.tilmid='$tid'")
or die(mysql_error());

Nogenlunde samme som Christians, har bare brugt de variabler du har brugt.
02. april 2010 - 12:12 #3
...og den query indsaetter du i din php kode for eksempel saaledes:

$result = mysql_query("SELECT arrdb.adag, tilmldb.*
FROM arrdb JOIN tilmldb ON arrdb.ID = tilmldb.arr_ID.");
while($row = mysql_fetch_array($result))
echo "arrangementdag = " . $row['adag'] . "<br/>deltager = " . $row['deltager'] . "<br/>betalt = " . $row['betalt']

o.s.v. hvad nu felterne i tilmldb hedder.
Avatar billede fancy Mester
02. april 2010 - 12:22 #4
min arrdb ser sådan ud

  aid int(10)  Nej  auto_increment             
  anavn varchar(100) utf8_general_ci  Nej               
  asted varchar(100) utf8_general_ci  Nej               
  dato varchar(100) utf8_general_ci  Nej               
  adag varchar(100) utf8_general_ci  Nej               
  afra varchar(10) utf8_general_ci  Nej               
  atil varchar(10) utf8_general_ci  Nej               
  abesk varchar(10000) utf8_general_ci  Nej               
  tilmeldt varchar(10) utf8_general_ci  Nej               
  pladser varchar(10) utf8_general_ci  Nej               
  bilsti varchar(100) utf8_general_ci  Nej 

og min tilmdb

  tid int(10)  Nej  auto_increment             
  tnavn varchar(100) utf8_general_ci  Nej               
  tadr varchar(100) utf8_general_ci  Nej               
  tpnr varchar(100) utf8_general_ci  Nej               
  tby varchar(100) utf8_general_ci  Nej               
  ttel varchar(100) utf8_general_ci  Nej               
  tmail varchar(100) utf8_general_ci  Nej               
  forening varchar(100) utf8_general_ci  Nej               
  numv varchar(100) utf8_general_ci  Nej               
  numb varchar(100) utf8_general_ci  Nej               
  medl varchar(100) utf8_general_ci  Nej               
  arrid varchar(100) utf8_general_ci  Nej               
  betalt varchar(1) utf8_general_ci  Nej

men den virker ikke så jeg har forsøgt at skrive den om
uden held

$result = mysql_query("SELECT arrdb.adag, tilmdb.*
FROM arrdb JOIN tilmdb ON arrdb.aid = tilmdb.arr_aid")
or die(mysql_error());
02. april 2010 - 12:30 #5
Du vil joine tabellerne paa arr.aid = tilmdb.arr_aid.

Jeg kan ikke se at du i tilmdb har et felt arr_aid.  Du har et felt arrid, men det er af datatype varchar arr.aid er af datatype INT.  For joinfelter skal datatypen vaere den samme.

Hvordan ved du hvilke tilmeldinger der hoerer til hvilke arrangementer?
Avatar billede fancy Mester
02. april 2010 - 12:36 #6
sådan her

$aid = $_GET['aid'];
include 'connect.php';
$result = mysql_query("SELECT * FROM tilmdb WHERE arrid='$aid'")
or die(mysql_error());
Avatar billede fancy Mester
02. april 2010 - 12:39 #7
det var noget vrøvl jeg for aid fra min admin side
<td><a href="tilm_list.php?aid='.$aid.'">Se tilmeldte</a></td>
02. april 2010 - 12:49 #8
Ok, hvis $aid er en tekststreng.  Men med den query faar du ingen oplysninger fra arrdb tabellen.  Det var det du i det oprindelige spoergsmaal sagde du ville.  Det ville ogsaa forbavse mig hvis arrdb dataerne ikke er noedvendige.

En bruger (eller administrator) definerer et arrangement og sender det til php siden i $_GET['aid'].  Hvordan ved brugeren hvilket arrangement han vil vide noget om?  Kender brugeren arrangementets navn?  Saaledes at tilmdb.arrid indeholder et arrangementsnavn der svarer til arrdb.anavn.  Og saa query SELECT arrdb.adag, tilmdb.* FROM arrdb JOIN tilmdb ON arrdb.anavn = tilmdb.arrid WHERE tilmdb.arrid = $aid.

Jeg staar og skal afsted, er tilbage om et par timer.
Avatar billede fancy Mester
02. april 2010 - 13:06 #9
ok tak så langt ... brugeren kender arrangement navn her tjekker jeg bla om der ledige pladser
skal selv til påske frokost så der er ingen respons før i aften

her er min kode den sidste query giver ingen data

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Oversigt over tilmeldte</title>
</head>

<body>
<?php
$aid = $_GET['aid'];
include 'connect.php';
$result = mysql_query("SELECT * FROM tilmdb WHERE arrid='$aid'")
//$result = mysql_query("SELECT arrdb.adag, tilmdb.* FROM arrdb JOIN tilmdb ON arrdb.anavn = tilmdb.arrid WHERE tilmdb.arrid = $aid.")
or die(mysql_error());
echo '<form id="form1" name="form1" method="post" action="tilm_list.php?aid='.$aid.'">
<table width="1000" border="1" cellpadding="0" cellspacing="0">
  <tr>
    <td width="172">Navn</td>
    <td width="175">Adresse</td>
    <td width="109">Telefon</td>
    <td width="173">E-mail</td>
    <td width="89">Antal voksne</td>
      <td width="89">sted</td>
 
    <td width="70">Slet</td>
  </tr>';
while($row = mysql_fetch_array( $result )) {
$tid = $row['tid'];
$navn = $row['tnavn'];
$adr = $row['tadr'];
$by = $row['tby'];
$pnr = $row['tpnr'];
$mail = $row['tmail'];
$tel = $row['ttel'];
$numv = $row['numv'];
$numb = $row['numb'];
$anavn = $row['anavn'];

echo '<table width="1000" border="1" cellpadding="0" cellspacing="1">
  <tr>
    <td width="172">'.$navn.'</td>
    <td width="175">'.$adr.' '.$by.', '.$pnr.'</td>
    <td width="109">'.$tel.'</td>
    <td width="173">'.$mail.'</td>
    <td width="89">'.$numv.'</td>
    <td width="89">'.$anavn.'</td>
   
    <td width="70"><a href="delete.php?tid=' . $tid . '" onclick="return confirm(\'Er du sikker?\');">SLET</a>
  </tr>';
}

?>


</body>
</html>
02. april 2010 - 16:18 #10
Det er vi ikke gode til at kommunikere om.  Du synes at foelge andre principper for databaser og kodning end dem jeg har laert og som virker for mig.  Saa vi burde nok stoppe her foer jeg spilder mere af din tid.

Men fordi vi tidligere har kunnet loese problemer sammen (http://www.eksperten.dk/spm/896134, http://www.eksperten.dk/spm/900824) proever jeg en sidste gang.  Hvis du kan bruge det er det godt, ellers saa skipper vi det.

1.  Jeg gaar ud fra at du i tabellen arrdb gemmer informationer om arrangementer, et arrangement for hver raekke i tabellen.  Ifoelge de principper om normalisering af data jeg har laert maa den samme raekke ikke forekomme to gange.  Hvis i tidens loeb de samme lokaler bruges til flere arrangementer saa vil lokalenavnet forekomme i flere raekker, men der maa vaere data elementer der unikt identificerer et arrangementer og ikke kan forekomme i mere end en raekke.  Det er ofte et ID i form af en talvaerdi.  Men hvis for eksempel hvert arrangement har sit eget navn og to arrangementer ikke kan have samme navn saa kan det unikke element ogsaa vaere navnet i form af en tekststreng.  Det unikke element kaldes primaernoegle.  Spoergsmaal:  Er din arrdb tabel indrettet paa denne maade, og hvis ja, hvilket felt er primaernoeglen?

2.  Saa gaar jeg ud fra at tabellen tilmdb indeholder tilmeldinger til de arrangementer der er indeholdt i arrdb, en raekke i tilmdb for hver tilmelding.  Hver tilmelding er for et bestemt arrangement, men hvert arrangement kan have flere tilmeldinger (haaber jeg for oekonomien af arrangementerne.)  Saa hver raekke i tilmdb haenger sammen med en raekke i arrdb.  For at fastslaa denne sammenhaeng maa der vaere et dataelement i tilmdb hvor primaernoeglen for den paagaeldende raekke i arrdb gentages.  Dette element kaldes fremmednoeglen fra tilmdb til arrdb.  Hvis du vaelger i arrdb at bruge aid som primaernoegle (anbefales) saa maa du i tilmdb indsaette endnu et felt med datatype int (fordi arrdb.aid har datatype int) og der i hver raekke i tilmdb indfylde aid for det paagaeldende arrangement.  Alternativt kan du aendre datatypen for tilmdb fra varchar til int og der indfylde aid tallene.  Hvis du vaelger at bruge anavn som primaernoegle i arrdb (og soerger for at det anavn aldrig genbruges, ikke i hundrede aar to arrangementer med det samme anavn) saa kan du, hvis du vil, bruge tilmdb.arrid som fremmednoegle som det er og der for hver raekke af tilmdb indfylde arrangementets navn som det staar i arrdb.anavn.

Spoergsmaal 2:  Har du indrettet tilmdb (eller vil du indrette tilmdb) med en fremmednoegle til arrdb?  Hvilket felt i tilmdb er fremmednoeglen?

3.  Saa vil du at en bruger indfoerer navnet paa et arrangement i $aid, og saa vil du ifoelge dit oprindelige spoergsmaal have arrdb.adag plus alle felter fra tilmdb for tilmeldinger til det arrangement.  Det kan lade sig goere hvis du har soerget for primaernoegle og fremmednoegle og er parat til at aendre din kode som foelger. 

Hvis vi for nu antager at primaer- og fremmednoegle er arrdb.anavn og tilmdb.arrid saa vil denne query virke:  $result = mysql_query("SELECT arrdb.adag, tilmdb.* FROM arrdb JOIN tilmdb ON arrdb.anavn = tilmdb.arrid WHERE arrdb.anavn = '$aid'") or die(mysql_error());

Hvis vi antager at primaernoeglen er arrdb.aid og du aendrer datatypen for tildb.arrid til int og bruger den som fremmednoegle bliver din query denne:  $result = mysql_query("SELECT arrdb.adag, tilmdb.* FROM arrdb JOIN tilmdb ON arrdb.aid = tilmdb.arrid WHERE arrdb.anavn = '$aid'") or die (mysql_error());

Hvis du i arrdb har et arrangement med det samme navn som det der staar i $aid saa vil du faa output.  Hvis der alligevel er et problem vil du faa en fejlmelding der fortaeller hvad problemet er.

Saa jeg haaber du har haft en god paaskefrokost.  Som sagt, hvis du kan bruge mit indput og er parat til at foelge de normaliserings- og kodningsprincipper jeg kender til saa kan vi gaa videre.  Ellers maa jeg bakke ud.
Avatar billede fancy Mester
02. april 2010 - 19:27 #11
Jeg vil med det samme sige at jeg ikke har "lært" noget om php og databaser ikke andet hvad jeg har kunne finde at tuturials her på nettet og genem besvarelser på eksperten.
så det er sikkert derfor jeg griber tingene forkert an,
og jeg er vildt imponeret over den viden som folk i dette forum ligger inde med.
men jeg tror ellers nok at db er lavet sådan som du skriver alle arrangementer har et unikt id "arrid" men kan hedde det samme ,
men hvordan ændre jeg tildb.arrid til fremmednoegle ..... jeg har jo en primær som aid eller er jeg helt gal på den.
jeg vil meget gerne følge de principper du forskriver

du kan måske se her
http://karsten-leth.dk/vagt/admin.php
http://karsten-leth.dk/vagt/arr_list.php
03. april 2010 - 07:32 #12
Altsaa arid er primaernoegle i arrdb.  Det var godt.  arid er af datatype int, altsaa et tal.  Hvert arrangement er saaledes identificeret ved et unikt nummer.  Lad os saa sige at en af raekkerne i tilmdb er en tilmelding til arrangement nummer 25.  Saa skal den raekke have et felt med datatype int der indeholder nummer 25.  Tilmdb som du viser i #4 har 13 kolonner/felter hvoraf kun den foerste kolonne, tid, er af datatype int, og tid er primaernoegle for tilmdb. tid identificerer tilmeldingen, ikke arrangementet.  De andre 12 felter er af datatype varchar, altsaa en tekst.  Du har saaledes ingen steder i tilmdb hvor du kan vise at en tilmelding er til arrangement nummer 25.  Kan du foelge mig?  Eller er det mig der er tosset?

Det maa du rette, ellers kan du, udfra mit kendskab, ikke komme videre.  Du kan rette det paa to maader, enten ved i tilmdb at tilfoeje en kolonne nummer 14 af datatype int eller ved at aendre et bestaaende varchar felt til et int felt og erstatte teksterne med numre.

Jeg gaetter at du vil vaelge at aendre tilmdb.arrid (eller staar der allerede tal i den kolonne og har du i dit indlaeg #4 skrevet forkert, skulle det have vaeret "arrid int utf8_general_ci  Nej " hvor der staar "arrid varchar(100) utf8_general_ci  Nej "?)  Rent praktisk er det nok nemmest foerst at droppe den bestaaende arrid kolonne (sql statement: ALTER TABLE tilmdb DROP arrid), og saa indsaette en ny kolonne (ALTER TABLE tilmdb ADD arrid int) og fylde vaerdier i den nye kolonne (UPDATE tilmdb SET arrid = 25 WHERE tid = 1 eller hvilke vaerdier du nu skal have ind.)

Naar saa det er paa plads saa kan du udtraekke arrangementerne med deres tilmeldinger saaledes: 

SELECT arrdb.*, tilmdb.* FROM arrdb JOIN tilmdb ON arrdb.aid = tilmdb.arrid. 

Hvis du kun vil have en enkelt kolonne med fra arrdb saa som adag bliver det SELECT arrdb.adag, tilmdb.* o.s.v.

Det var saa langt.  Nu har du, forstaar jeg, ikke brug for alle tilmeldingerne til alle arrangementer men kun alle tilmeldinger til et enkelt arrangement, nemlig det arrangement du identificerer i $_GET['aid'] og $aid.  Hvad noejagtigt staar der i $_GET['aid']?  Er det et tal der angiver arrangementets nummer, en tekst der angiver arrangementets navn, eller hvad?  Du synes i #9 at antyde at $_GET['aid'] indeholder arrangementets navn.  Hvis det er det navn der staar i arrdb.anavn saa udvider du din query saaledes:

SELECT arrdb.adag, tilmdb.* FROM arrdb JOIN tilmdb ON arrdb.aid = tilmdb.arrid WHERE arrdb.anavn = $aid

Men hvis der saa er flere arrangementer med det samme navn som du siger kan forekomme saa faar du tilmeldingerne for flere arrangementer, hver paa sin adag.

Hvis $_GET['aid'] og $aid i stedet identificerer arrangementet ved dets nummer bliver det i stedet ....WHERE arrdb.aid = $aid.

Det udtoemmer saa den viden jeg ligger inde med.  Hvis du synes det ser fornuftigt ud er du velkommen til at bruge det.  Hvis du i stedet vaelger at lade dine tabeller vaere som de er og at identificere et arrangement ud fra et felt i tilmdb saa er du naturligvis ogsaa velkommen til det, men saa maa du soege viden fra anden side.

Kan vi lukke spoergsmaalet her?  Det er blevet en lang traad.
Avatar billede fancy Mester
03. april 2010 - 10:03 #13
Jeg kan oplyse at aid et et tal og kan godt se ne hvad jeg skal have ændret, det er en anden  tanke gang end jeg havde men jeg ville vist over åen for at hente vand
mange tak for hjælpen og den meget fine beskrivelse dette er noget jeg kan bruge, forsat god påske !!
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