• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Abfrage über Zuweisungstabellen

bodo92

Aktives Mitglied
Hallo :)

Ich versuche mich jetzt zum ersten mal daran aus meiner fein säuberlich normalisierten Datenbank etwas ausgespuckt zu bekommen..
Habe die einzelnen Tabellen auch mittels INNER JOIN verbunden jedoch bekomme ich jetzt statt einem Ergebnis gleich 18, mir ist klar das ich die Zellwerte die mehrfach vorhanden sind irgendwie ala PHP implode() aneinanderketten muss. Oder bin ich mit meinem Query total auf dem Holzweg :D

Hier mal mein Query:
Code:
SELECT
    einsaetze.id,
    einsaetze.titel,
    einsaetze.bericht,
    einsaetze.personal,
    einsaetze_ort.ort,
    einsaetze_stichwort.stichwort,
    einsaetze_fahrzeuge.fahrzeug, // Hier können jeweils mehrere Einträge vorkommen.
    einsaetze_feuerwehren.feuerwehr, // Hier können jeweils mehrere Einträge vorkommen.
    einsaetze_kraefte.kraft // Hier können jeweils mehrere Einträge vorkommen.
FROM
    einsaetze
    INNER JOIN einsaetze_ort ON einsaetze.id=einsaetze_ort.id
    INNER JOIN einsaetze_stichwort ON einsaetze.id=einsaetze_stichwort.id
    INNER JOIN einsaetze_zuweisung_fahrzeuge ON einsaetze.id=einsaetze_zuweisung_fahrzeuge.einsatz_id
    INNER JOIN einsaetze_fahrzeuge ON einsaetze_zuweisung_fahrzeuge.fahrzeug_id=einsaetze_fahrzeuge.id
    INNER JOIN einsaetze_zuweisung_feuerwehren ON einsaetze.id=einsaetze_zuweisung_feuerwehren.einsatz_id
    INNER JOIN einsaetze_feuerwehren ON einsaetze_zuweisung_feuerwehren.feuerwehr_id=einsaetze_feuerwehren.id
    INNER JOIN einsaetze_zuweisung_kraefte ON einsaetze.id=einsaetze_zuweisung_kraefte.einsatz_id
    INNER JOIN einsaetze_kraefte ON einsaetze_zuweisung_kraefte.kraft_id=einsaetze_kraefte.id
 
Ich hätte eventuell erwähnen sollen das meine Tabelle einsaetze nur einen Eintrag hat. Es werden nur alle möglichen Kombinationen der Spalten ausgegeben..
 
Hier nochmal der Query mit WHERE
Code:
SELECT
    einsaetze.id,
    einsaetze.titel,
    einsaetze.bericht,
    einsaetze.personal,
    einsaetze_ort.ort,
    einsaetze_stichwort.stichwort,
    einsaetze_fahrzeuge.fahrzeug,
    einsaetze_feuerwehren.feuerwehr,
    einsaetze_kraefte.kraft
FROM
    einsaetze
    INNER JOIN einsaetze_ort ON einsaetze.id=einsaetze_ort.id
    INNER JOIN einsaetze_stichwort ON einsaetze.id=einsaetze_stichwort.id
    INNER JOIN einsaetze_zuweisung_fahrzeuge ON einsaetze.id=einsaetze_zuweisung_fahrzeuge.einsatz_id
    INNER JOIN einsaetze_fahrzeuge ON einsaetze_zuweisung_fahrzeuge.fahrzeug_id=einsaetze_fahrzeuge.id
    INNER JOIN einsaetze_zuweisung_feuerwehren ON einsaetze.id=einsaetze_zuweisung_feuerwehren.einsatz_id
    INNER JOIN einsaetze_feuerwehren ON einsaetze_zuweisung_feuerwehren.feuerwehr_id=einsaetze_feuerwehren.id
    INNER JOIN einsaetze_zuweisung_kraefte ON einsaetze.id=einsaetze_zuweisung_kraefte.einsatz_id
    INNER JOIN einsaetze_kraefte ON einsaetze_zuweisung_kraefte.kraft_id=einsaetze_kraefte.id
WHERE
    einsaetze.id=1

Und hier das Ergebnis:
PHP:
<?php
/**
* Export to PHP Array plugin for PHPMyAdmin
* @version 0.2b
*/

//
// Database `feuerwehr`
//

// `feuerwehr`.`einsaetze`
$einsaetze = array(
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'KdoW','feuerwehr' => 'FF&nbsp;Schauerberg','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'KdoW','feuerwehr' => 'FF&nbsp;Schauerberg','kraft' => 'Rettungsdienst'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'HLF&nbsp;20/16','feuerwehr' => 'FF&nbsp;Schauerberg','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'HLF&nbsp;20/16','feuerwehr' => 'FF&nbsp;Schauerberg','kraft' => 'Rettungsdienst'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'MZF','feuerwehr' => 'FF&nbsp;Schauerberg','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'MZF','feuerwehr' => 'FF&nbsp;Schauerberg','kraft' => 'Rettungsdienst'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'KdoW','feuerwehr' => 'FF&nbsp;Neustadt/Aisch','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'KdoW','feuerwehr' => 'FF&nbsp;Neustadt/Aisch','kraft' => 'Rettungsdienst'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'HLF&nbsp;20/16','feuerwehr' => 'FF&nbsp;Neustadt/Aisch','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'HLF&nbsp;20/16','feuerwehr' => 'FF&nbsp;Neustadt/Aisch','kraft' => 'Rettungsdienst'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'MZF','feuerwehr' => 'FF&nbsp;Neustadt/Aisch','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'MZF','feuerwehr' => 'FF&nbsp;Neustadt/Aisch','kraft' => 'Rettungsdienst'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'KdoW','feuerwehr' => 'FF&nbsp;Wilhelmsdorf','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'KdoW','feuerwehr' => 'FF&nbsp;Wilhelmsdorf','kraft' => 'Rettungsdienst'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'HLF&nbsp;20/16','feuerwehr' => 'FF&nbsp;Wilhelmsdorf','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'HLF&nbsp;20/16','feuerwehr' => 'FF&nbsp;Wilhelmsdorf','kraft' => 'Rettungsdienst'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'MZF','feuerwehr' => 'FF&nbsp;Wilhelmsdorf','kraft' => 'Polizei'),
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','fahrzeug' => 'MZF','feuerwehr' => 'FF&nbsp;Wilhelmsdorf','kraft' => 'Rettungsdienst')
);

Macht man die Abfrage bei Zuweisungstabellen überhaupt in einem Statement oder bemüht man mehrere Abfragen und setzt sie mit PHP zusammen, ich würde gerne die Fahrzeuge, Feuerwehren und Kräfte in einem String ('fahrzeug1, fahrzeug2') oder einem array('fahrzeug1', 'fahrzeug2') haben.
 
Danke für die Tipps..
Habe jetzt mittels GROUP_CONCAT eigentlich soweit mein Ziel erreicht, habe aber noch ein paar Fragen bleiben noch.

Mein Query:
Code:
SELECT
    einsaetze.id,
    einsaetze.titel,
    einsaetze.bericht,
    einsaetze.personal,
    einsaetze_ort.ort,
    einsaetze_stichwort.stichwort,
    GROUP_CONCAT(DISTINCT einsaetze_fahrzeuge.fahrzeug ORDER BY einsaetze_fahrzeuge.id ASC),
    GROUP_CONCAT(DISTINCT einsaetze_feuerwehren.feuerwehr ORDER BY einsaetze_feuerwehren.feuerwehr ASC),
    GROUP_CONCAT(DISTINCT einsaetze_kraefte.kraft ORDER BY einsaetze_kraefte.kraft ASC)
FROM
    einsaetze
    LEFT JOIN einsaetze_ort ON einsaetze.id=einsaetze_ort.id
    LEFT JOIN einsaetze_stichwort ON einsaetze.id=einsaetze_stichwort.id
    LEFT JOIN einsaetze_zuweisung_fahrzeuge ON einsaetze.id=einsaetze_zuweisung_fahrzeuge.einsatz_id
    LEFT JOIN einsaetze_fahrzeuge ON einsaetze_zuweisung_fahrzeuge.fahrzeug_id=einsaetze_fahrzeuge.id
    LEFT JOIN einsaetze_zuweisung_feuerwehren ON einsaetze.id=einsaetze_zuweisung_feuerwehren.einsatz_id
    LEFT JOIN einsaetze_feuerwehren ON einsaetze_zuweisung_feuerwehren.feuerwehr_id=einsaetze_feuerwehren.id
    LEFT JOIN einsaetze_zuweisung_kraefte ON einsaetze.id=einsaetze_zuweisung_kraefte.einsatz_id
    LEFT JOIN einsaetze_kraefte ON einsaetze_zuweisung_kraefte.kraft_id=einsaetze_kraefte.id
WHERE
    einsaetze.id=1

Liefert wie gewünscht einen Kommagetrennten String:
PHP:
$einsaetze = array(
  array('id' => '1','titel' => 'TEST','bericht' => 'TEST
','personal' => '1','ort' => 'Emskirchen','stichwort' => 'B 1','GROUP_CONCAT(DISTINCT einsaetze_fahrzeuge.fahrzeug ORDER BY einsaetze_fahrzeuge.id ASC)' => 'KdoW,HLF&nbsp;20/16,MZF','GROUP_CONCAT(DISTINCT einsaetze_feuerwehren.feuerwehr ORDER BY einsaetze_feuerwehren.id ASC)' => 'FF&nbsp;Schauerberg,FF&nbsp;Neustadt/Aisch,FF&nbsp;Wilhelmsdorf','GROUP_CONCAT(DISTINCT einsaetze_kraefte.kraft ORDER BY einsaetze_kraefte.id ASC)' => 'Polizei,Rettungsdienst')
);

Jetzt zu meinen Fragen:
- GROUP BY konnte ich nicht erfolgreich Einsetzen, ich kann es auch einfach nicht verstehen.
- Wenn ich meine CROUP_CONCAT ohne DISTINCT ausführe bekomme ich total viele Doppeleinträge in den einzelnen Spalten.
Etwa so:
PHP:
$einsaetze = array(
  array('id' => '2','titel' => 'VU - eingeklemmte Person','bericht' => 'LALALLALA','personal' => '21','ort' => NULL,'stichwort' => 'B 2','GROUP_CONCAT(einsaetze_fahrzeuge.fahrzeug ORDER BY einsaetze_fahrzeuge.id ASC)' => 'KdoW,KdoW,KdoW,KdoW,KdoW,KdoW,KdoW,KdoW,HLF&nbsp;20/16,HLF&nbsp;20/16,HLF&nbsp;20/16,HLF&nbsp;20/16,HLF&nbsp;20/16,HLF&nbsp;20/16,HLF&nbsp;20/16,HLF&nbsp;20/16,LF&nbsp;8,LF&nbsp;8,LF&nbsp;8,LF&nbsp;8,LF&nbsp;8,LF&nbsp;8,LF&nbsp;8,LF&nbsp;8','GROUP_CONCAT(einsaetze_feuerwehren.feuerwehr ORDER BY einsaetze_feuerwehren.feuerwehr ASC)' => 'FF&nbsp;Brunn,FF&nbsp;Brunn,FF&nbsp;Brunn,FF&nbsp;Brunn,FF&nbsp;Brunn,FF&nbsp;Brunn,FF&nbsp;Buchklingen,FF&nbsp;Buchklingen,FF&nbsp;Buchklingen,FF&nbsp;Buchklingen,FF&nbsp;Buchklingen,FF&nbsp;Buchklingen,FF&nbsp;Dürrnbuch,FF&nbsp;Dürrnbuch,FF&nbsp;Dürrnbuch,FF&nbsp;Dürrnbuch,FF&nbsp;Dürrnbuch,FF&nbsp;Dürrnbuch,FF&nbsp;Eckenberg,FF&nbsp;Eckenberg,FF&nbsp;Eckenberg,FF&nbsp;Eckenberg,FF&nbsp;Eckenberg,FF&nbsp;Eckenberg','GROUP_CONCAT(einsaetze_kraefte.kraft ORDER BY einsaetze_kraefte.kraft ASC)' => 'KBM,KBM,KBM,KBM,KBM,KBM,KBM,KBM,KBM,KBM,KBM,KBM,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL,UG-ÖEL')
);
Das ist bestimmt nicht sinn der sache das ich das einfach mit DISTINCT unterdrücke oder?​
 
:rolleyes: mir ist ein Licht aufgegangen..
Code:
SELECT
    einsaetze.id,
    einsaetze.titel,
    einsaetze.bericht,
    einsaetze.personal,
    einsaetze_ort.ort,
    einsaetze_stichwort.stichwort,
    GROUP_CONCAT(DISTINCT einsaetze_fahrzeuge.fahrzeug ORDER BY einsaetze_fahrzeuge.id ASC),
    GROUP_CONCAT(DISTINCT einsaetze_feuerwehren.feuerwehr ORDER BY einsaetze_feuerwehren.feuerwehr ASC),
    GROUP_CONCAT(DISTINCT einsaetze_kraefte.kraft ORDER BY einsaetze_kraefte.kraft ASC)
FROM
    einsaetze
    LEFT JOIN einsaetze_ort ON einsaetze.ort_id=einsaetze_ort.id
    LEFT JOIN einsaetze_stichwort ON einsaetze.stichwort_id=einsaetze_stichwort.id
    LEFT JOIN einsaetze_zuweisung_fahrzeuge ON einsaetze.id=einsaetze_zuweisung_fahrzeuge.einsatz_id
    LEFT JOIN einsaetze_fahrzeuge ON einsaetze_zuweisung_fahrzeuge.fahrzeug_id=einsaetze_fahrzeuge.id
    LEFT JOIN einsaetze_zuweisung_feuerwehren ON einsaetze.id=einsaetze_zuweisung_feuerwehren.einsatz_id
    LEFT JOIN einsaetze_feuerwehren ON einsaetze_zuweisung_feuerwehren.feuerwehr_id=einsaetze_feuerwehren.id
    LEFT JOIN einsaetze_zuweisung_kraefte ON einsaetze.id=einsaetze_zuweisung_kraefte.einsatz_id
    LEFT JOIN einsaetze_kraefte ON einsaetze_zuweisung_kraefte.kraft_id=einsaetze_kraefte.id
WHERE
    einsaetze.id=2
GROUP BY
    einsaetze.id

Bleibt nur noch die Frage mit dem DISTINCT
 
Bleibt nur noch die Frage mit dem DISTINCT
Na kommt sich darauf an ob du nur einzigartige Werte willst.
Ich frage mich jedoch gerade, was willst du eigentlich erreichen? Macht es überhaupt Sinn, alles in eine Abfrage zu packen? Eine riesige Abfrage ist nicht automatisch besser als mehrere kleine.
 
Ich finde es nur komisch das ich so viele Doppeleinträge ohne DISTINCT hätte ist das normal und korrekt oder ist da noch wo ein fehler?

Genau das habe ich mich auch gefragt aber ich hatte im Hinterkopf man soll statt mehreren Anweisungen eine machen.
Was ich mit diesem Query erreichen möchte ist das ich eine Detailansicht eines Einsatzes darstelle, also alle einzelnen Felder einfach in HTML einbetten und die Felder mit mehreren Werten in ein Array einlese und dann mittels einer Schleife in PHP evtl. noch kleine Icons der Fahrzeuge einbinden.
 
Bitte um eure Meinung..

Soll ich wie oben alles mit einer Abfrage holen und dann den String mit den Fahrzeugen in ein Array einlesen, oder soll ich mir die Fahrzeuge, ... jeweils mit einer extra Abfrage holen:

So ungefähr:
Code:
SELECT
    einsaetze_fahrzeuge.fahrzeug
FROM
    einsaetze_fahrzeuge
    INNER JOIN einsaetze_zuweisung_fahrzeuge ON einsaetze_zuweisung_fahrzeuge.fahrzeug_id=einsaetze_fahrzeuge.id
WHERE
    einsaetze_zuweisung_fahrzeuge.einsatz_id=1
 
Zurück
Oben