MySQL - 2 DB-Abfragen oder JOIN?

k3nguruh

Erfahrenes Mitglied
Hallo,

ich möchte gerne eine HTML-Tabellen mit Daten aus 2 DB-Tabellen befüllen. Dazu habe ich mal ein vereinfachtes Beispiel erstellt. Ich hoffe, dass mein "Wunsch" ersichtlich wird.

Welche DB-Abfrage wäre sinnvoller, bzw. geht es vll. auch anders, einfacher?
Ich möchte mich im vorraus schon einmal für eure Hilfe bedanken...

Let's go:

DB - Tabelle 1 (Einträge)
id, code, eintrag, .....

DB - Tabelle 2 (Anlagen)
eid, anlage, .....

Abfrage 1:
PHP:
$result = $sql->query("SELECT id, code, eintrag, ... FROM tbl_eintrag WHERE ....");
while ($row = $sql->fetch_array($result))
{
    $html_val[$row['id']]['code'] = $row['code'];
    $html_val[$row['id']]['eintrag'] = $row['eintrag'];

    $result2 = $sql->query("SELECT eid, anlage, ... FROM tbl_anlage WHERE eid = '$result['id']'");
    while ($row2 = $sql->fetch_array($result2))
    {
        $html_val[$row['id']]['anlage'][$row2['eid']]['eid'] = $row2['eid'];       
        $html_val[$row['id']]['anlage'][$row2['eid']]['anlage'] = $row2['anlage'];
    }
}

Abfrage 2:
PHP:
$result = $sql->query("SELECT tbl_e.id, tbl_e.code, tbl_e.eintrag, ... FROM tbl_eintrag AS tbl_e LEFT JOIN tbl_anlage AS tbl_a ON (tbl_e.id = tbl_a.eid) WHERE ....");
while ($row = $sql->fetch_array($result))
{
    $html_val[$row['id']]['code'] = $row['code'];
    $html_val[$row['id']]['eintrag'] = $row['eintrag'];

    if ($row['eid'])
    {
        $html_val[$row['id']]['anlage'][$row['eid']]['eid'] = $row['eid'];
        $html_val[$row['id']]['anlage'][$row['eid']]['anlage'] = $row['anlage'];
    }
}

Ergebnis:

Code:
HTML- Tabelle:
-------------------------------------------------------------
| TBL-Kopf-Spalte 1 | TBL-Kopf-Spalte 2 | TBL-Kopf-Spalte 3 |
-------------------------------------------------------------
|                   |                   |                   |
| Eintrag 1         | Anlage 1          |                   |
|                   | Anlage 2          |                   |
|                   |                   |                   |
-------------------------------------------------------------
|                   |                   |                   |
| Eintrag 2         | Anlage 1          |                   |
|                   | Anlage 2          |                   |
|                   | Anlage 3          |                   |
|                   |                   |                   |
-------------------------------------------------------------
 
Hallo,

ja, es gibt Einträge die keine Anlage haben, daher sollte LEFT JOIN der richtige Weg sein.


Ich habe hier noch ein anderes (für mich noch komplexeres) Beispiel. Vll kann mir einer sagen, ob ich das doch in mehreren Abfragen packen muss. Das Prinzip sollte dann wie oben sein.
(Innerhalb der Result-Schleife von der Tabelle "mitglied_profil" die anderen 3 abfragen.)

Die Spalte uid in den Tabellen habe ich erstmal nur so hinzugefügt, um einen Primary/Unique/Auto Key zu haben. Bei meinen ersten gehversuchen mit Datenbank und Co, hatte ich in der Tabelle "mitglied_profil" die letzten 3 Tabellen je in ein Textfeld (serialsiertes Array) integriert. Jetzt beim überarbeiten, möchte ich es halt "richtiger" machen.

Lets go:

Tabelle "mitglied_profil"
pid, pcode, vorname, nachname, ....

Tabelle "mitglied_dienststellung" (keine oder mehrere möglich)
uid, pid, dienststellung

Tabelle "mitglied_befaehigung" (keine oder mehrere möglich)
uid, pid, befaehigung

Tabelle "mitglied_berechtigung" (keine oder mehrere möglich)
uid, pid, berechtigung

Derzeit Frage ich jede Tabelle einzeln ab, sprich 4 Abfragen. Deshalb hatte ich hier auch meinen Thread gesetzt. Wenn ich das jetzt alles in eine Abfrage reinsetze und mit LEFT JOIN verknüpfe bekomme ich für mein Test-Mitglied 96 Ergebniszeilen geliefert (Teabelle "mitglied_profil" = 1 Eintrag, "mitglied_dienststellung" = 2 Einträge, "mitglied_befaehigung" = 4 Einträge, "mitglied_berechtigung" = 12 Einträge)

SQL:
SELECT
    mp.*,
    md.*,
    mbef.*,
    mber.*
FROM mitglied_profil AS mp
    LEFT JOIN mitglied_dienststellung AS md
        ON ( mp.pid = md.pid )
    LEFT JOIN mitglied_befaehigung AS mbef
        ON ( mp.pid = mbef.pid )
    LEFT JOIN mitglied_berechtigung AS mber
        ON ( mp.pid = mber.pid )
WHERE
    mp.pid = '1000'
    AND
    mp.pcode = '9ce76991a6'

Das Ergebnis sollte dann so aussehen:
Code:
Array
(
    [pid] => 1000
    [pcode] => 9ce76991a6
    [anrede] => anrede
    [vorname] => vorname
    [nachname] => nachname

    [dienststellung] => Array
        (
            [0] => eintrag1
            [1] => eintrag2
        )

    [befaehigung] => Array
        (
            [0] => eintrag1
            [1] => eintrag2
            [2] => eintrag3
            [3] => eintrag4
        )

    [berechtigung] => Array
        (
            [0] => eintrag1
            [1] => eintrag2
            [2] => eintrag3
            [3] => eintrag4
            [4] => eintrag5
            [5] => eintrag6
            [6] => eintrag7
            [7] => eintrag8
            [8] => eintrag9
            [9] => eintrag10
            [10] => eintrag11
            [11] => eintrag12
        )

)
 
Zuletzt bearbeitet:
Zurück