Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Zwei Tabellen verknüfen (https://www.delphipraxis.net/143363-zwei-tabellen-verknuefen.html)

Luckie 14. Nov 2009 10:03

Datenbank: MySQL • Zugriff über: PHP

Zwei Tabellen verknüfen
 
Ich habe zwei Tabellen:
Tabelle adressen:
Code:
name
vorname
kategorie_id
Tabelle adr_kategorien:
Code:
id
name
Wenn ich jetzt einen Datensatz abspeichere wird die ID der Kategorie in dem Feld kategorie_id abgelegt.

Jetzt will ich alle Datensätze aus der Tabelle adressen, die einer bestimmten Kategorie entsprechen. Die Kategorie liegt dabei als Text vor und nicht als ID der Tabelle. Was ich im Internet gefunden habe:
Code:
SELECT adressen.*
FROM adressen
INNER JOIN adr_kategorien
WHERE adr_kategorien.name='Geschäftlich'
Das funktioniert leider nicht. Führe ich den Query aus, bekomme ich alle Datensätzen.

Dann versuche ich noch zu einem Datensatz aus der Tabelle adressen die zugehörige Kategorie (Namen) zur KategorieID zu bekommen.

arbu man 14. Nov 2009 10:07

Re: Zwei Tabellen verknüfen
 
Das sollte mit einem einfach join gehen z.b. so
SQL-Code:
select a.* -- oder adressen.*
from adressen a, adr_kategorien k
where a.kategorie_id = k.id and k.name = 'Geschäftlich'

fkerber 14. Nov 2009 10:11

Re: Zwei Tabellen verknüfen
 
Hi!

Wenn ich dich richtig verstanden habe, dann versuche mal das:

SQL-Code:
SELECT adressen.*
FROM adressen
JOIN adr_kategorien ON adressen.kategorie_id = adr_kategorien.name
WHERE adr_kategorien.name='Geschäftlich'
Zu deinem zweiten Problem:
Was hast du denn von dem Datensatz aus Adressen? Nur Name und Vorname?


Grüße, Frederic

mkinzler 14. Nov 2009 10:12

Re: Zwei Tabellen verknüfen
 
Oder besser in der neueren Syntax als expliziten JOIN
SQL-Code:
SELECT
    a.*
FROM
    adressen
        INNER JOIN adr_kategorien k on k.id a.kategorie_id
WHERE
    adr_kategorien.name='Geschäftlich';

DeddyH 14. Nov 2009 10:20

Re: Zwei Tabellen verknüfen
 
Aber dann den Alias a nicht vergessen:
SQL-Code:
SELECT
    a.*
FROM
    adressen a
        INNER JOIN adr_kategorien k on k.id a.kategorie_id
WHERE
    adr_kategorien.name='Geschäftlich';

mkinzler 14. Nov 2009 10:23

Re: Zwei Tabellen verknüfen
 
in weiterer Grund gegen C&P
SQL-Code:
SELECT
    a.*
FROM
    adressen a
        INNER JOIN adr_kategorien k on k.id a.kategorie_id
WHERE
    k.name='Geschäftlich';

DeddyH 14. Nov 2009 10:24

Re: Zwei Tabellen verknüfen
 
:lol: wir nähern uns der Lösung ^^

Luckie 14. Nov 2009 10:26

Re: Zwei Tabellen verknüfen
 
Also ich habe es jetzt wie arbu man gemacht. Das funktioniert.

Bleibt noch der zweite Query. Also dass er mir den Kategorienamen passend zur ID mit ausgibt zu den anderen Feldern.

DeddyH 14. Nov 2009 10:30

Re: Zwei Tabellen verknüfen
 
Meinst Du so?
SQL-Code:
SELECT
    k.name, a.*
FROM
    adressen a
        INNER JOIN adr_kategorien k on k.id a.kategorie_id
WHERE
    k.name='Geschäftlich';

mkinzler 14. Nov 2009 10:30

Re: Zwei Tabellen verknüfen
 
Einfach Feld mit angeben:
SQL-Code:
SELECT
    a.*,
    k.name
FROM
    adressen a
        INNER JOIN adr_kategorien k on k.id a.kategorie_id
WHERE
    k.name='Geschäftlich';

Luckie 14. Nov 2009 10:38

Re: Zwei Tabellen verknüfen
 
Nein, nein.

Ungefiltert. Ich lasse mir alle Datensätze aus adressen ausgeben. Ich will aber nicht die ID der Kategorie da stehen haben, sondern den Namen der Kategorie. Mit der ID kann man ja nichts anfangen.

Neutral General 14. Nov 2009 10:41

Re: Zwei Tabellen verknüfen
 
Hi Luckie,

schau dir doch am besten mal an wie JOINs in SQL generell funktionieren. Musst du ein paar mal üben und dann hast du sicher den Bogen raus und du merkst dass das was du machen willst total einfach ist ;)

Gruß
Neutral General

mkinzler 14. Nov 2009 10:42

Re: Zwei Tabellen verknüfen
 
Dieser steht doch in k.name
Oder meinst du eine 2. Abfrage über alle Adressen, dann lasse einfach die where clause weg.

Luckie 14. Nov 2009 10:55

Re: Zwei Tabellen verknüfen
 
@Neutral General: Das Versuche ich auch gerade, habe aber so meine Schwierigkeiten damit.

@mkinzler:
Zitat:

Oder meinst du eine 2. Abfrage über alle Adressen, dann lasse einfach die where clause weg.
Ja das meinte ich.

Wenn ich das so mache:
Code:
$query = "SELECT a.*
                     FROM adressen a, adr_kategorien k
                     WHERE a.kategorie_id = k.id";
               $resultset = mysql_query($query);
               while($row = mysql_fetch_object($resultset))
               {
               
                  echo "<tr>
                     <td>[url='./details.php?id=".$row->id."']".$row->name."[/url]</td>
                     <td>[url='./details.php?id=".$row->id."']".$row->vorname."[/url]</td>
                     <td></td>
                     <td>".$row->priv_strasse."</td>
Bekomme ich nur alle Datensätze bei denen das feld kategorie_id nicht leer ist.

Das zweite Problem ist, wie greife ich dann auf das Ergebnis zu? Ich habe ja in beiden Tabellen das Feld name. Über
Code:
$row->...
wird es wohl nicht gehen oder?

mkinzler 14. Nov 2009 10:58

Re: Zwei Tabellen verknüfen
 
SQL-87 unterstützt nur inner joins. für outer Joins benötigst du die SQL-92 Syntax:
SQL-Code:
SELECT
    a.*,
    k.name as Kategorienname
FROM
    adressen a
        Left outer JOIN adr_kategorien k on k.id a.kategorie_id;

DeddyH 14. Nov 2009 10:59

Re: Zwei Tabellen verknüfen
 
Dann vergib doch Aliase auf die Felder, damit werden sie eindeutig identifizierbar.

Luckie 14. Nov 2009 11:06

Re: Zwei Tabellen verknüfen
 
Da muss was falsch sein:
Code:
$query = "SELECT
                     a.*,
                     k.name as k_name
                     FROM adressen a
                     LEFT OUTER JOIN adr_kategorien k on k.id a.kategorie_id";
Zitat:

Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource

mkinzler 14. Nov 2009 11:08

Re: Zwei Tabellen verknüfen
 
Lass mal das OUTER weg

DeddyH 14. Nov 2009 11:09

Re: Zwei Tabellen verknüfen
 
Da fehlt ein Gleichheitszeichen in der JOIN-Bedingung.

Luckie 14. Nov 2009 11:17

Re: Zwei Tabellen verknüfen
 
Zitat:

Zitat von DeddyH
Da fehlt ein Gleichheitszeichen in der JOIN-Bedingung.

Autsch, das hätte ich auch sehen müssen. Danke euch allen, jatzt habe ich, was ich brauche.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz