Avatar billede mads2008 Nybegynder
30. juli 2013 - 13:35 Der er 13 kommentarer og
1 løsning

Kombinere to tabeller med PHP (illutration vedhæftet)

Hej

Jeg har problemer med at forstå hvordan jeg kombinerer to tabeller. Det er for avanceret til mig!

Skal kombinere to tabeller med id (tabel 1) og registrant_id (tabel 2)

Se billedelink herunder.
http://storbykonference.ungaalborg.dk/Kombiner_to_MYSQL_tabeller.png

Videre herunder, er hvor jeg er gået i stå:

<?php
mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");

$query="SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.registrant_id";

$result=mysql_query($query);
$num=mysql_num_rows($result);

$i=0;
while ($i < $num) {

$first_name=mysql_result($result,$i,"first_name");
$last_name=mysql_result($result,$i,"last_name");
$organization=mysql_result($result,$i,"organization");
$city=mysql_result($result,$i,"city");
$zip=mysql_result($result,$i,"zip");
$address=mysql_result($result,$i,"address");
$country=mysql_result($result,$i,"country");
$comment=mysql_result($result,$i,"comment");
field_id data fra tabel 2 her...

echo "<tr><td>$first_name $last_name</td><td> <i>$organization</i></td><td>$zip $city</td><td>$address</td><td>$country</td><td width=100px>$comment</td></tr>";

$i++;
}

mysql_close();
?>

Håber der er nogen som ved hvad jeg skal gøre - helst så simpelt som muligt?

Mvh
Mads Frederiksen
30. juli 2013 - 15:09 #1
Jeg er ikke sikker på, at jeg har forstået hvad problemet er.  Vil du simpel hen have field_id skrevet ud på linje med first_name, organization o.s.v.?  Så må du vel fortsætte med:

........
$comment=mysql_result($result,$i,"comment");
$field_id=mysql_result($result,$i,"field_id");

Men det er næsten for simpelt, så dit problem er nok noget andet.  Forklar nærmere.
Avatar billede mads2008 Nybegynder
30. juli 2013 - 17:29 #2
Hej

Jeg vil trække informationer som er bundet sammen med id fra TABEL 1 og registrant_id  TABEL 2 ud på en linje.

Det er TABEL 2 som er tricky, fordi der ligger 6 field_id og 6 field_value som skal trækkes ud til registrant_id og combines med informationer fra id i TABEL 1

TABEL 1
id              Navn              Adresse
52            Jens              Vejnavn

TABEL 2
registrant_id    field_id    field_value
52                  1              Hotel
52                  2              CVR
52                  3              Fakturaadresse
52                  5              Ja/Nej
52                  8              Jobtitel
52                  9              Ankomst

Skal blive til :
Jens    Vejnavn      Hotel      CVR      Fakturaadresse      Ja/Nej    Jobtitel    Ankomst

Håber der hjælper
30. juli 2013 - 18:14 #3
Jeg kikker på det igen nu.  Men jeg er dybt forvirret.  Jeg må tilstå, at jeg har svært ved at tro du vil have udskrevet, taget bogstaveligt:

Jens Vejnavm Hotel CVR Fakturaadresse ....

Jeg går ud fra, at du vil have udskrevet, for eksempel:

Jens Hansen      Jagtvej 25 Odense    Grand hotel    Brogade 27 Odense    ....

Er det rigtigt forstået?

I så fald, hvor ved du fra, for eksempel, hvilket hotel Jens Hansen har?  Din tabel 2 viser kun, for hver registrant, "Hotelvalg" "Hotel" ...  Har du givet os den rigtige, og fuldstændige, information?  Eller er det mig der ikke fatter noget?

Måske er det din tabel struktur der driller mig.  Jeg vil gætte på, at du har brug for en tabel med personer, tabel 1.  Hver person kan så registrere nul, en, eller mange gange, og du holder styr på registreringerne i tabel 2.  For hver registrering skal du vide fakturainfo, hotelvalg, ankomstdag o.s.v. Så tror jeg nok de fleste ville lave tabel 2 således:

id    registrant    fakturainfo    hotelvalg    ankostdag
1        52        info 27    Grand Hotel    27 juni 2013
2        53        details    Petit Hotel      28 juni 2013
3        52        ny info    Harmonien    13 august 2013

o.s.v.

Tror du, at du kan fortælle mere om hvad du, bogstavelig talt, vil have skrevet ud med eksempler og mere om din tabel 2, hvor der står for eksempel hvilket hotel hvem har valgt, og hvad baggrunden er for dit valg af tabel struktur?
Avatar billede mads2008 Nybegynder
30. juli 2013 - 19:04 #4
Haha, ja du har fuldstændig ret mht vejnavn hotel, ankomstdag osv. Det er bare mine aliasser til dette spørgsmål.

Der hvor der står hotelvalg kunne der stå Hotel Grand.

Jeg har ikke selv valgt databasestrukturen - det er data fra en tilmeldingsform.

Se her:
http://storbykonference.ungaalborg.dk/index.php/sign-up?task=individual_registration&event_id=1

Nogle af felterne gemmes i tabel 1 andre i tabel 2

Tabelstruktur
Tabel 1 http://storbykonference.ungaalborg.dk/tabel1.png
Tabel 2 http://storbykonference.ungaalborg.dk/tabel2.png
Avatar billede arne_v Ekspert
30. juli 2013 - 18:36 #5
Jeg tror at det du leder efter er noget a la:

SELECT t1.navn,t1.adresse,t2hotel.field_value,t2cvr.field_value
FROM tabel1 t1
JOIN tabel2 t2hotel ON t1.id=t2hotel.registrant_id AND t2hotel.field_id=1
JOIN tabel2 t2cvr ON t1.id=t2cvr.registrant_id AND t2cvr.field_id=2

[tilfoej selv de sidste 4]
31. juli 2013 - 12:18 #6
Jeg begynder at forstå sammenhængen.  Jeg vil tilslutte mig #4.
Avatar billede mads2008 Nybegynder
31. juli 2013 - 12:59 #7
Ok. Jeg har forsøgt mig, men nu er det mig som ikke helt forstår.

Jeg forsøger mig i øjeblikket med #4 men er ikke helt med på hvordan det virker.

hvad er t1 og t2?
31. juli 2013 - 13:33 #8
t1, t2hotel, t2cvr er aliasser (øgenavne) på tabellerne.  På grund af den tossede tabelstruktur (som du således ikke kan gøre for) er du nødt til at tilgå tabel2 adskillige gange og kalde tabellen noget forskelligt hver gang.
Avatar billede mads2008 Nybegynder
31. juli 2013 - 13:33 #9
OK #4 lader til at virke :o)


SELECT t1.first_name,t1.last_name,t1.address,t1.organization,t1.city,t1.zip,t1.country,t1.comment,t2hotel.field_value,t2cvr.field_value,t2eban.field_value
FROM tabel1 t1
JOIN tabel2 t2hotel ON t1.id=t2hotel.registrant_id AND t2hotel.field_id=5

Mangler nu bare at kunne specificere mit output fra tabel2.

Tabel 1 virker med:
$first_name=mysql_result($result,$i,"first_name");
$last_name=mysql_result($result,$i,"last_name");
osv..

Tabel 2 får jeg fejl på denne
$hotel=mysql_result($result,$i," t2hotel ");

Warning: mysql_result() [function.mysql-result]: t2hotel not found in MySQL result index 4

Det er t2hotel som ikke er korrekt.
Avatar billede mads2008 Nybegynder
31. juli 2013 - 16:14 #10
Output som er beskrevet i #9 er det sidste jeg mangler, så lægger jeg hele løsningen samlet ud.
Avatar billede arne_v Ekspert
31. juli 2013 - 16:16 #11
Du skal vel bruge "t2hotel.field_value" eller nok snarere lave et alias

SELECT ...,t2hotel.field_value AS hotel,...

og saa bare bruge "hotel"
Avatar billede mads2008 Nybegynder
31. juli 2013 - 16:43 #12
Du er guld!! Smid et svar.

Her er det samlede.

<?php
$username="*******";
$password="************************";
$database="****************";

mysql_connect(localhost,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");

$query="
SELECT t1.first_name,t1.last_name,t1.address,t1.organization,t1.city,t1.zip,t1.country,t1.comment,t2hotel.field_value AS hotel,t2cvr.field_value AS cvr,t2eban.field_value AS eban
FROM tabel1 t1
JOIN tabel2 t2hotel ON t1.id=t2hotel.registrant_id AND t2hotel.field_id=5
JOIN tabel2 t2cvr ON t1.id=t2cvr.registrant_id AND t2cvr.field_id=3
JOIN tabel2 t2eban ON t1.id=t2eban.registrant_id AND t2eban.field_id=2
ORDER BY t1.country ASC,t1.first_name ASC
";

$result=mysql_query($query);
$num=mysql_num_rows($result);

?>

<table>
<?php
$i=0;
while ($i < $num) {

$first_name=mysql_result($result,$i,"first_name");
$last_name=mysql_result($result,$i,"last_name");
$organization=mysql_result($result,$i,"organization");
$city=mysql_result($result,$i,"city");
$zip=mysql_result($result,$i,"zip");
$address=mysql_result($result,$i,"address");
$country=mysql_result($result,$i,"country");
$comment=mysql_result($result,$i,"comment");
$hotel=mysql_result($result,$i,"hotel");
$cvr=mysql_result($result,$i,"cvr");
$eban=mysql_result($result,$i,"eban");

echo "<tr><td>$first_name $last_name</td><td> <i>$organization</i></td><td>$zip $city</td><td>$address</td><td>$country</td><td>$hotel</td><td>$cvr</td><td>$eban</td><td width=100px>$comment</td></tr>";

$i++;
}

mysql_close();
?>
</table>
Avatar billede arne_v Ekspert
31. juli 2013 - 18:50 #13
svar
Avatar billede mads2008 Nybegynder
31. juli 2013 - 19:05 #14
Mange tak til jer begge for hjælpen.
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