Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Multi-Select inkl. Zuordnung

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von exzel, 19 Juni 2012.

  1. exzel

    exzel Datenbank-Guru

    Hallo zusammen,

    ich erstelle ein Programm zur Kundendatenverwaltung. Innerhalb des Programmes werden auch Lebensversicherungsverträge angelegt. In diesem LV-Verträgen gibt es einmal den Vertragsinhaber (VN), bis zu zwei versicherte Personen (VP1, VP2) und zwei Bezugsberechtigte (Bezug1, Bezug2). Die Namen mit den Primärschlüsseln befinden sich in der Tabelle persdaten. Die Verträge in der Tabelle vertraege_lv. Bisher habe ich jeweils einen SELECT-Befehl ausgeführt, um die Namen der Kunden zu bekommen.

    Für den Vertragsinhaber
    Code:
    SELECT vertraege_lv.id_vn, name, vorname FROM vertraege_lv, persdaten WHERE persdaten.id_vn = vertraege_lv.id_vn
    AND persdaten.id_vn = '{$vertragfeld['id_vn']}';
    Für die 1. Versicherte Person
    Code:
    SELECT vertraege_lv.id_vp1, name, vorname FROM vertraege_lv, persdaten WHERE persdaten.id_vn = vertraege_lv.id_vp1
    AND persdaten.id_vn = '{$vertragfeld['id_vp1']}';
    Und noch ein Beispiel für den Bezugsberechtigten.
    Code:
    SELECT vertraege_lv.bezugsrechterl, name, vorname FROM vertraege_lv, persdaten WHERE persdaten.id_vn = vertraege_lv.bezugsrechterl
    AND persdaten.id_vn = '{$vertragfeld['bezugsrechterl']}';
    Die Variable '{$vertragfeld['']}' entstammt aus dem PHP-Programm.

    Ist es nun möglich, das ganze als eine Abfrage zu gestalten?



    Gruß
     
  2. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Hy,

    natürlich....

    Code:
     
    SELECT vertraege_lv.id_vn
          ,vInhaber.name AS Vertragsinhaber_Name
          ,vInhaber.vorname AS Vertragsinhaber_Vorname
    
          ,v1VersPers.name AS VersichertePerson_Name
          ,v1VersPers.vorname AS VersichertePerson_Vorname
    
          ,vBezugsBer.name AS Bezugsberechtigten_Name
          ,vBezugsBer.vorname AS Bezugsberechtigten_Vorname
    
     FROM vertraege_lv
           ,persdaten vInhaber
           ,persdaten v1VersPers
           ,persdaten vBezugsBer
    
    WHERE vInhaber.persdaten.id_vn = vertraege_lv.id_vn
    AND vInhaber.persdaten.id_vn = '{$vertragfeld['id_vn']}'
    
    AND v1VersPers.persdaten.id_vn = vertraege_lv.id_vp1
    AND vInhaber.persdaten.id_vn = '{$vertragfeld['id_vn']}'
    
    AND vBezugsBer.persdaten.id_vn = vertraege_lv.bezugsrechterl
    AND vInhaber.persdaten.id_vn = '{$vertragfeld['id_vn']}'
    
    
    ;
     
    
    Lg
     
  3. exzel

    exzel Datenbank-Guru

    Hallo und danke für die Antwort!

    Noch eine Frage. Was bedeutet vInhaber, V1VersPers und vBezugsBer hinter persdaten. Selektiert er dann sich nur die Spalten heraus? Müsste dann nicht ein Punkt zwischen persdaten und vInhaber stehen?
    FROM vertraege_lv
    ,persdaten vInhaber
    ,persdaten v1VersPers
    ,persdaten vBezugsBer

    Gruß
     
  4. exzel

    exzel Datenbank-Guru

    Hallo ich habe es selbst herausbekommen.

    Es handelt ich hierbei um einen Alias.

    http://dev.mysql.com/doc/refman/5.1/de/select.html

    Gruß
     
  5. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Genau Tabellenalias!!!

    Funktionierts nun wie gewünscht?

    Lg
     
  6. exzel

    exzel Datenbank-Guru

    Danke, ich habe aber noch nicht umgesetzt. Aber nur zum besseren Verständnis. Damit der Multi-Select in der Form überhaupt funktioniert, muss ein Tabellenalias gemacht werden, oder?
     
  7. PLSQL_SQL

    PLSQL_SQL Datenbank-Guru

    Ja genau!

    Der Tabellenalias ermöglicht es mehrfach die gleiche Tabelle zu joinen!

    Lg
     
  8. exzel

    exzel Datenbank-Guru

    Hallo,

    nach langer Zeit habe ich nun endlich den Versuch gewagt, aber leider bin ich gescheitert. Zuerst hat die Abfrage über PHP nicht funktioniert. Ich musste den Code wie folgt ändern.


    PHP:
    $abfrage=$mysqli->query("SELECT vertraege_lv.id_vn
          ,vInhaber.name AS Vertragsinhaber_Name
          ,vInhaber.vorname AS Vertragsinhaber_Vorname
     
          ,v1VersPers.name AS VersichertePerson_Name
          ,v1VersPers.vorname AS VersichertePerson_Vorname
     
          ,vBezugsBer.name AS Bezugsberechtigten_Name
          ,vBezugsBer.vorname AS Bezugsberechtigten_Vorname
     
    FROM vertraege_lv
          ,persdaten vInhaber
          ,persdaten v1VersPers
          ,persdaten vBezugsBer
     
    WHERE vInhaber.id_vn = vertraege_lv.id_vn
    AND vInhaber.id_vn = '
    {$vertragfeld['id_vn']}'
     
    AND v1VersPers.id_vn = vertraege_lv.id_vp1
    AND vInhaber.id_vn = '
    {$vertragfeld['id_vn']}'
     
    AND vBezugsBer.id_vn = vertraege_lv.bezugsrechterl
    AND vInhaber.id_vn = '
    {$vertragfeld['id_vn']}';");
    $_POST=$abfrage->fetch_array();
    Ich hatte also in den unteren Zeilen wie dieser
    WHERE vInhaber.persdaten.id_vn = vertraege_lv.id_vn

    persdaten herausgelöscht. Dann wurde zwar die Abfrage ohne Fehlermeldung durchgeführt, aber ohne ein Ergebnis.
    Auch var_dump($abfrage) brachte lediglich ein object(mysqli_result)#11 (0) {}
    Über die bisherigen Abfragen wurden aber Ergebnisse angezeigt.

    Gruß
     
  9. ukulele

    ukulele Datenbank-Guru

    Wenn ich das richtig verstehe, musst du statt
    Code:
    WHERE vInhaber.persdaten.id_vn = vertraege_lv.id_vn
    AND vInhaber.persdaten.id_vn = '{$vertragfeld['id_vn']}'
     
    AND v1VersPers.persdaten.id_vn = vertraege_lv.id_vp1
    AND vInhaber.persdaten.id_vn = '{$vertragfeld['id_vn']}'
     
    AND vBezugsBer.persdaten.id_vn = vertraege_lv.bezugsrechterl
    AND vInhaber.persdaten.id_vn = '{$vertragfeld['id_vn']}'
    wie von PLSQL vorgeschlagen
    Code:
    WHERE ( vInhaber.persdaten.id_vn = vertraege_lv.id_vn
    OR v1VersPers.persdaten.id_vn = vertraege_lv.id_vp1
    OR vBezugsBer.persdaten.id_vn = vertraege_lv.bezugsrechterl )
    AND vInhaber.persdaten.id_vn = '{$vertragfeld['id_vn']}'
    verwenden, oder ich verstehe das jetzt falsch.
     
  10. exzel

    exzel Datenbank-Guru

    Hallo nochmal und entschuldigt die späte Rückmeldung.

    Die Lösung in meinem Fall sieht nun wie folgt aus:

    SELECT id_vertrag, vn.name AS VN, vp1.name AS VP1, vp2.name AS VP2, bezugerl.name AS bezugerl, bezugtod.name AS bezugtod
    FROM persdaten vn, persdaten vp1, persdaten vp2, persdaten bezugerl, persdaten bezugtod, vertraege_lv
    WHERE vn.id_vn = vertraege_lv.id_vn
    AND vp1.id_vn = vertraege_lv.id_vp1
    AND vp2.id_vn = vertraege_lv.id_vp2
    AND bezugerl.id_vn = vertraege_lv.bezugsrechterl
    AND bezugtod.id_vn = vertraege_lv.bezugsrechttod

    Die Schwierigkeit war, dass nicht alle Felder immer ausgefüllt sein mussten. Manche konnten auch leer sein und waren nur mit der Zahl 0 belegt. Also wenn in der Maske keine Person ausgewählt ist, dann wird in der vertraege_lv Tabelle der Eintrag mit einer 0 besetzt. Ein Eintrag mit der id 0 in der Tabelle persdaten war aber nicht vorhanden. Deshalb kam bei manchen Suchabfragen kein Ergebnis heraus. Es gibt hierfür zwei Lösungen. Entweder einen Blindeintrag in der Tabelle persdaten mit der id 0 erstellen. Oder aber mit Union die Abfrage erweitern und eine Spalte für die 0 integrieren. Hier ein Beispiel:

    SELECT id_vertrag, vn.name AS VN, vp1.name AS VP from persdaten vn, persdaten vp1, vertraege_lv where vn.id_vn = vertraege_lv.id_vn AND vp1.id_vn = vertraege_lv.id_vp1 UNION SELECT id_vertrag, vn.name AS VN, 0 AS VP from persdaten vn, persdaten vp1, vertraege_lv where vn.id_vn = vertraege_lv.id_vn AND vertraege_lv.id_vp1 = 0

    Gruß und Dank
     
    Walter gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden