Avatar billede buch78 Novice
11. august 2003 - 15:40 Der er 39 kommentarer og
1 løsning

Binde 2 tabeller sammen

Kan man i Mysql binde 2 tabeller sammen. Sådan så jeg kun skal hente fra den ene med php..

Jeg tænkte på at hvis man i en tabel havde adresse og postnr.. og i en anden tabel postnr. & by..
Så kunne jeg godt tænke mig at mysql selv hentede en værdi ind..
Avatar billede -thomas- Nybegynder
11. august 2003 - 15:45 #1
Ja, det kan du med brug af JOINS.
fx.:

SELECT tabel1.adresse, tabel1.postnr, tabel2.by FROM tabel1 LEFT JOIN tabel2 ON tabel1.postnr = tabel2.postnr
Avatar billede peturkirke Novice
11. august 2003 - 15:46 #2
hvis du ikke kan bruge:

SELECT kunde.navn, kunde.adresse, kunde.postnr, postnr.byen
FROM kunde, postnr
WHERE kunde.postnr = postnr.postnr

så må du nok have både postnr og by i den samme tabel og kun en tabel
Avatar billede limemedia Nybegynder
11. august 2003 - 15:47 #3
SELECT t1.adresse, t1.postnr, t2.by
FROM tabel1 AS t1, tabel2 AS t2
WHERE t1.postnr=t2.postnr

Så vil dit udtræk indeholde værdier "bundet sammen" fra to tabeller, eller mere korrekt benævnt, via et join.

/ LJ
Avatar billede buch78 Novice
11. august 2003 - 15:47 #4
kan man binde 2 tabeller sammen i phpadmin.. eller kan man kun binde dem sammen når man henter noget ud ?? (FX php)
Avatar billede peturkirke Novice
11. august 2003 - 15:48 #5
kun når man henter ud
Avatar billede thomasledet Nybegynder
11. august 2003 - 15:55 #6
men hvis du laver et select-statement som angivet ovenfor i phpmyadmin, så ser det jo også ud som om det er een tabel... er det ikke godt nok?
Avatar billede limemedia Nybegynder
11. august 2003 - 15:56 #7
du kan i andre databaser lave forskellige former for hvad du ønsker, men mysql tilbyder ikke denne service. Er det vigtigt for dig, kan du enten kigge lidt på PostgreSQL der også er Opensource, eller fx MS SQL Server - der dog er peberet i licenser
Avatar billede -thomas- Nybegynder
11. august 2003 - 16:01 #8
ljweb> der er da ingen grund til at skifte database for at kunne hente byen til et postnummer fra en anden tabel :)
det er der da masser af mulighed for i mysql.
Avatar billede peturkirke Novice
11. august 2003 - 16:02 #9
måske skal buch forklare mere grundigt hvad det er, han vil ????
Avatar billede limemedia Nybegynder
11. august 2003 - 16:04 #10
-thomas- >> jeg har forklaret hvorledes han kan det han vil, og såfremt han vil "binde sammen", vil det kræve et view/stored procedure til at gøre det. At det så er dobbeltarbejde, fremfor dét join jeg anbefalede, er en anden snak.
Avatar billede buch78 Novice
11. august 2003 - 16:05 #11
ljweb = hvad mener du med at det er dobbelt arbejde...
Avatar billede limemedia Nybegynder
11. august 2003 - 16:13 #12
buch >> en join er vejen frem, som du ovenfor har fået skitseret løsningen på. Da du lavede de to tabeller med stamdata i én tabel og post/by i anden, viser du at du ved lidt om database opbygning og normalformer. Eller måske du var heldig ;)

Hvis du ikke ønsker at anvende en join direkte i dit udtræk, må du på serveren lave en eller anden form for funktion, der gør arbejdet "transperent" for dig - det kunne være en "stored procedure" eller fx et "view". mySQL tilbyder ikke de faciliteter - de fokuserer på at levere data hurtigt, og derved udelader de nogle funktioner. Andre databaser er måske ikke lige så hurtige, men fokuserer anderledes, herunder MS SQL Server, PostgreSQL og Oracle.

Jeg anbefaler dig ikke at lave en sådan funktion, men det kan være det virker for dig - det var et alternativ, hvis ikke du ønskede den simple join. That's all
Avatar billede -thomas- Nybegynder
11. august 2003 - 16:13 #13
Ja ok, selvfølgelig kan det gøres vha af et view i en mssql-database, men det synes da ikke at være behovet her. Hvorfor er det dobbelt arbejde?
Avatar billede limemedia Nybegynder
11. august 2003 - 16:15 #14
-thomas- >> vend den om - hvorfor er det ikke et dobbelt arbejde, at 1) oprette en funktion og 2) laver en query der henter information ud af denne funktion, når man istedet kan lave en funktion, der henter den samlede information baseret på et join.
Avatar billede limemedia Nybegynder
11. august 2003 - 16:20 #15
som noget helt andet, så ville jeg nok droppe tabellen med post/by referencen, ligge den som et PHP array i en fil, og fra dit kald refere til $POSTBY[$postnr] ... Bynavne er statiske og ændres extremt sjældent. Det vil gøre queryen hurtigere og behovet for en join er forsvundet.
Avatar billede buch78 Novice
11. august 2003 - 16:27 #16
ok.. jeg har lige prøvet med join

$re = mysql_query("SELECT tabel1.gadenavn, tabel1.postnr, tabel2.by FROM tabel1 LEFT JOIN tabel2 ON tabel1.postnr = tabel2.postnr ");
echo "<table>";
while ($row = mysql_fetch_array($re)) {
echo "
<tr><table border=1 width=320>
  <td>".$row['cpr']."</td>
  <td>".$row['postnr']."</td>
</tr>";
}
echo "</table>";

Men det virker ikke
Avatar billede buch78 Novice
11. august 2003 - 16:28 #17
ups istedet for at der stå cpr.. skulle der stå gadenavn
Avatar billede buch78 Novice
11. august 2003 - 16:30 #18
sådan skulle det se ud

<?
$db = mysql_connect("localhost","root","");
mysql_select_db("udlejning");
$re = mysql_query("SELECT person.gadenavn, person.postnr, postnr.by FROM person LEFT JOIN postnr ON person.postnr = postnr.postnr ");
echo "<table>";
while ($row = mysql_fetch_array($re)) {
echo "
<tr><table border=1 width=320>
  <td>".$row['gadenavn']."</td>
  <td>".$row['postnr']."</td>
  <td>".$row['by']."</td>
</tr>";
}
echo "</table>";
mysql_close($db);
?>
Avatar billede peturkirke Novice
11. august 2003 - 16:31 #19
by er et reserveret ord i mysql
prøv at ændre by til byen
Avatar billede buch78 Novice
11. august 2003 - 16:33 #20
Det hjælpe ikke på det..
Avatar billede peturkirke Novice
11. august 2003 - 16:33 #21
kommer der slet intet på skærmen ?
Avatar billede buch78 Novice
11. august 2003 - 16:34 #22
nej den er blank
Avatar billede peturkirke Novice
11. august 2003 - 16:35 #23
har tabellerne records ?
Avatar billede buch78 Novice
11. august 2003 - 16:36 #24
ja.. jeg har oprettet 2 styks
Avatar billede peturkirke Novice
11. august 2003 - 16:36 #25
jeg får ikke testet her hvor jeg sidder
måske de 2 andre er i gang med det ?
Avatar billede limemedia Nybegynder
11. august 2003 - 16:41 #26
petur >> pt ikke - der blev valgt en anden løsning end den jeg foreslog ;)
Avatar billede buch78 Novice
11. august 2003 - 16:45 #27
ljweb = kan du ikke lige forklare hvordan du ville lave det..
Avatar billede limemedia Nybegynder
11. august 2003 - 16:51 #28
buch >> det forklarede jeg da, flere gange...

Den simple, men ikke helt optimale

<?php
  $sql = mysql_query("
    SELECT p.gadenavn, p.postnr, pn.bynavn
    FROM person AS p, postnr AS pn
    WHERE p.postnr=pn.postnr
  ") or die(mysql_error());

  if (mysql_num_rows($sql)) {
    while ($foo = mysql_fetch_row($sql)) {
      print_r($foo);
    }
  }
?>
Avatar billede limemedia Nybegynder
11. august 2003 - 16:56 #29
udskift evt mysql_fetch_row med mysql_fetch_assoc, det er nemmere at identificere. og i postnummer tabellen, har jeg omdøbt "by" til "bynavn" - by anvendes af systemet til andre funktioner og må ikke anvendes
Avatar billede buch78 Novice
11. august 2003 - 16:57 #30
jeg får en fejl der hedder "Unknown column 'p.postnr' in 'field list'"
Avatar billede limemedia Nybegynder
11. august 2003 - 17:04 #31
der findes ikke et felt i din "person" tabel der hedder "postnr"
Avatar billede buch78 Novice
11. august 2003 - 17:07 #32
ok der var en stave fejl.. så nu virker den... jeg vil dog lige prøv at se om jeg kan finde ud af at lave en fast ramme omkring
Avatar billede limemedia Nybegynder
11. august 2003 - 17:11 #33
mon ikke ?
Avatar billede -thomas- Nybegynder
11. august 2003 - 17:13 #34
Selvfølgelig virker den da også med en LEFT JOIN... Sikker på du angiver navnene rigtigt og at felttyperne i postnr er de samme?
Avatar billede buch78 Novice
11. august 2003 - 17:14 #35
jeg prøver det lige...
Avatar billede buch78 Novice
11. august 2003 - 17:29 #36
jeg har lige prøvet

SELECT t1.adresse, t1.postnr, t2.by
FROM tabel1 AS t1, tabel2 AS t2
WHERE t1.postnr=t2.postnr

og den virker også...

hvis jeg nu vil have den til at hente fra t3 også er dette så rigtigt

SELECT t1.adresse, t1.postnr, t2.by ,t3.info
FROM tabel1 AS t1, tabel2 AS t2
WHERE t1.postnr=t2.postnr=t3.postnr
Avatar billede limemedia Nybegynder
11. august 2003 - 17:41 #37
FROM tabel1 AS t1, tabel2 AS t2, tabel3 AS t3
WHERE t1.postnr=t2.postnr && t1.postnr=t3.postnr
Avatar billede buch78 Novice
30. september 2003 - 21:56 #38
ljweb gidder du ikke lige smide et svar..??
Avatar billede buch78 Novice
18. januar 2004 - 21:22 #39
smid lige et svar lars-jensen
Avatar billede buch78 Novice
26. februar 2005 - 08:20 #40
lukker nu
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