Multi-Select inkl. Zuordnung

exzel

Datenbank-Guru
Beiträge
170
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ß
 
Werbung:

PLSQL_SQL

Datenbank-Guru
Beiträge
176
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
 

exzel

Datenbank-Guru
Beiträge
170
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ß
 

exzel

Datenbank-Guru
Beiträge
170
Hallo ich habe es selbst herausbekommen.

Es handelt ich hierbei um einen Alias.

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

Für einen Tabellenverweis kann mit tbl_name AS alias_name oder tbl_name alias_name ein Alias erstellt werden:
SELECT t1.name, t2.salary FROM employee AS t1, info AS t2
WHERE t1.name = t2.name;

SELECT t1.name, t2.salary FROM employee t1, info t2
WHERE t1.name = t2.name;

Gruß
 

exzel

Datenbank-Guru
Beiträge
170
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?
 

exzel

Datenbank-Guru
Beiträge
170
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ß
 

ukulele

Datenbank-Guru
Beiträge
4.416
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.
 
Werbung:

exzel

Datenbank-Guru
Beiträge
170
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
 
Oben