php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 13.04.2009, 10:31  
Benutzer
 
Registriert seit: 04.05.2008
Beiträge: 77
ghost120 befindet sich auf einem aufstrebenden Ast
Standard MySQL Abfrage über 5 Tabellen evtl. IF

Hallo,
ich habe ein Problem und zwar habe ich folgende Tabellen:

schaden:
- Schadennr
- Polizzennr

Vertrag:
- ID
- Polizzennr
- Personennr
...

Person:
- Personennr
- PersArtCd (entweder N - Natürliche Person oder S - sonstige Person)

Natuerliche_person:
- Personennr
- Vorname
- Nachname

Sonstige_Person:
- Personennr
- Name

Und nun habe ich folgendes Problem ich frage die Datensätze aus der Tabelle "Schaden" ab nun habe ich aber keine Kundennamen dazu, also verbinde ich Schaden.Polizzennr mit Vertrag.Polizzennr dann Vertrag.Personennr mit Person.Personennr nun kann es aber natürliche oder sonstige Person sein, also gibt es eine Möglichkeit so eine Art IF Abfrage im query zu machen? Also wenn Person.PersArtCd = N ist, dann die Daten von natuerliche_person abfragen, andernfalls von sonstige_person....
Ich hoffe ihr wisst, was ich meine und könnt mir helfen.
Ich habe schon versucht das mit ner IF zu lösen, aber irgendwie klappt das nicht, außerdem hätte ich gerne ne bessere Lösung, da bei dieser die Abfrage unübersichtlich wird....

PHP-Code:
SELECT schaden.IDschaden.Schadennrschaden.Polizzennrschaden.Vermnrschaden.SpartenCdschaden.Ereigniszpkt, IF(p.PersArtCd == "N"THEN np.Familienname Kunde ELSE sp.Name Kunde END IF FROM schadenperson pvertrag vtgnatuerliche_person npsonstige_person sp WHERE schaden.BearbStandCd "O"
AND schaden.Polizzennr vtg.Polizzennr AND vtg.VN p.Personennr AND IF(p.PersArtCd == "N"THEN p.Personennr np.Personennr ELSE p.Personennr sp.Personennr END IF 
Danke
LG Alex
ghost120 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 13.04.2009, 10:46  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Code:
..
INNER JOIN person p
ON ..
LEFT JOIN natuerliche_person np
ON p.personennr = np.personennr AND p.persartcd = "N"
LEFT JOIN sonstige_person sp
ON p.personennr = sp.personennr AND p.persartcd = "S"
Eine der beiden Tabellen sollte nun gejoint worden sein.
__________________
"Nuschel ich?" - "Was?"
Chriz ist offline   Mit Zitat antworten
Alt 13.04.2009, 10:50  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Warum sind Natuerliche_person und Sonstige_Person in getrennten Tabellen geführt und nicht einfach über ein weiteres Feld in einer Tabelle unterscheidbar?

Da die konkrete Personennr (hoffentlich) nur entweder in Natuerliche_person oder in Sonstige_Person zu finden ist, kannst Du das mit einem LEFT JOIN lösen. Eine von beiden Verknüpfungen liefert dann kein Ergebniss und die entsprechenden Felder im Ergebnisdatensatz sind dann NULL. Mit Coalesce kannst Du die Herkunft aus den beiden Tabellen "verbergen".

PHP-Code:
<?php
$mysql 
mysql_connect('localhost''localuser''localpass') or die(mysql_error());
mysql_select_db('test'$mysql) or die(mysql_error());

// Testtabellen
mysql_query('CREATE TEMPORARY TABLE foo ( id int auto_increment, primary key(id) )'$mysql) or die(mysql_error());
mysql_query('CREATE TEMPORARY TABLE natuerliche_foo ( foo_id int, x varchar(64), primary key(foo_id) )'$mysql) or die(mysql_error());
mysql_query('CREATE TEMPORARY TABLE sonstige_foo ( foo_id int, x varchar(64), primary key(foo_id) )'$mysql) or die(mysql_error());
// Testdaten
mysql_query('INSERT INTO foo () VALUES (),(),()'$mysql) or die(mysql_error());
mysql_query("INSERT INTO natuerliche_foo (foo_id, x) VALUES (1,'nat1'), (3,'nat2')"$mysql) or die(mysql_error());
mysql_query("INSERT INTO sonstige_foo (foo_id, x) VALUES (2,'sonst1')"$mysql) or die(mysql_error());



// Beispielabfrage
$query '
  SELECT
    foo.id, Coalesce(natuerliche_foo.x, sonstige_foo.x) as name
  FROM
    foo
  LEFT JOIN
    natuerliche_foo
  ON
    foo.id=natuerliche_foo.foo_id
   LEFT JOIN
    sonstige_foo
  ON
    foo.id=sonstige_foo.foo_id
'
;
$result mysql_query($query$mysql) or die(mysql_error());
while ( 
false!==($row=mysql_fetch_array($resultMYSQL_ASSOC)) ) {
  echo 
$row['id'], ': '$row['name'], "<br />\n";
}

Geändert von David (13.04.2009 um 10:52 Uhr). Grund: ein paar Rechtschreibfehler weniger
David ist offline   Mit Zitat antworten
Alt 13.04.2009, 10:51  
Benutzer
 
Registriert seit: 19.10.2008
Beiträge: 44
tohms befindet sich auf einem aufstrebenden Ast
Standard

Also zunächst mal wäre es toll, wenn Du in die Abfrage noch ein paar Absätze rein bringen würdest, damit man das Ganze auf einmal sieht (Übersichtlichkeit).
Dann bin ich, wenn vermeidbar, persönlich kein Freund von Rechen- und Vergleichsaufgaben innerhalb einer Abfrage (ist Geschmackssache) und die Frage wäre: machst Du das Ganze direkt in der Datenbank oder nutzt Du eine andere Sprache zum Ausführen des Codes?

Zu den JOINS: Falls Du Einfluss auf die Struktur der Datenbank hast, schließe ich mich hier meinen Vorschreibern an
tohms ist offline   Mit Zitat antworten
Alt 13.04.2009, 11:01  
Benutzer
 
Registriert seit: 04.05.2008
Beiträge: 77
ghost120 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von David Beitrag anzeigen
Warum sind Natuerliche_person und Sonstige_Person in getrennten Tabellen geführt und nicht einfach über ein weiteres Feld in einer Tabelle unterscheidbar?
Also wir haben das in der Schule so gelernt, in meine Fall speichere ich die Kunden unterteilt in Privat und Firmenkunden, Bestimmte Felder wie Strasse, Hausnr, PLZ, Ort... gibt es ja bei beiden, aber bei Privatkunden gibt es ein paar Felder welche es bei den Firmenkunden nicht gibt, deswegen ist es getrennt. Man könnte natürlich alle in eine Tabelle bringen, aber ich dachte das ist nicht gut, wenn z.B. bei den ganzen Firmenkunden unnötige Felder da sind, welche dann leer sind...


Zitat:
Zitat von tohms Beitrag anzeigen
Also zunächst mal wäre es toll, wenn Du in die Abfrage noch ein paar Absätze rein bringen würdest, damit man das Ganze auf einmal sieht (Übersichtlichkeit).
Dann bin ich, wenn vermeidbar, persönlich kein Freund von Rechen- und Vergleichsaufgaben innerhalb einer Abfrage (ist Geschmackssache) und die Frage wäre: machst Du das Ganze direkt in der Datenbank oder nutzt Du eine andere Sprache zum Ausführen des Codes?

Zu den JOINS: Falls Du Einfluss auf die Struktur der Datenbank hast, schließe ich mich hier meinen Vorschreibern an
Ja ich führe die Abfragen in PHP aus.
ghost120 ist offline   Mit Zitat antworten
Alt 13.04.2009, 11:23  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Zitat:
Man könnte natürlich alle in eine Tabelle bringen, aber ich dachte das ist nicht gut, wenn z.B. bei den ganzen Firmenkunden unnötige Felder da sind, welche dann leer sind...
Schlechter als jetzt ständig ein LEFT JOIN mehr zu benötigen? Hängt davon ab, wie oft diese Abfrage ausgeführt wird (relativ zu anderen Abfragen auf den selben Tabellen) und wie groß der "Verschnitt" ist. Ich bezweifel jetzt einfach mal, dass sich die zwei Tabellen bei Dir lohnen.
David ist offline   Mit Zitat antworten
Alt 13.04.2009, 11:33  
Benutzer
 
Registriert seit: 04.05.2008
Beiträge: 77
ghost120 befindet sich auf einem aufstrebenden Ast
Standard

Nagut ich habe das jetzt mal so gelöst, eigentlich ist es mir mit einer Tabelle sowieso lieber. Die meisten Felder werden für die Privatkunden benötigt, spezielle Felder für Firmenkunden gibt es eh nur 3 Aber nun sind bei den Firmenkunden eben ca. 10-15 Felder leer...
Wovon hängt es denn ab, ob es sich lohnt oder nicht? Ich nehme mal an, an der Anzahl der Datensätze, oder?
Danke

LG Alex

//EDIT:
Jetzt habe ich noch ein Problem wenn ich nur die Schäden und die dazugehörigen Verträge auslese geht alles ziemlich schnell:
PHP-Code:
SELECT schaden.IDschaden.Schadennrschaden.Polizzennrschaden.Vermnr
schaden.SpartenCdschaden.Ereigniszpkt 
FROM schaden
vertrag vtg WHERE schaden.BearbStandCd "O" 
AND schaden.Polizzennr vtg.Polizzennr 
ORDER BY schaden
.Ereigniszpkt 
Code:
die Abfrage dauerte 0.0161 sek.
Wenn ich allerdings die Kunden dazu haben will:
PHP-Code:
SELECT schaden.IDschaden.Schadennrschaden.Polizzennrschaden.Vermnr
schaden.SpartenCdschaden.Ereigniszpktk.Personennr 
FROM schaden
vertrag vtgkunden k 
WHERE schaden
.BearbStandCd "O" AND schaden.Polizzennr vtg.Polizzennr 
AND vtg.VN k.Personennr 
ORDER BY schaden
.Ereigniszpkt 
Code:
die Abfrage dauerte 7.6731 sek.
Ich weiß nicht woran das liegt.

Geändert von ghost120 (13.04.2009 um 11:49 Uhr).
ghost120 ist offline   Mit Zitat antworten
Alt 13.04.2009, 11:43  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Wenn der bei weitem überwiegende Teil der Abfragen sich immer nur mit einer der beiden Tabellen beschäftigen würde, könnte man darüber nachdenken. Sehe cih hier aber nicht.
Und bei juristischen Personen hast Du auch meistens Kontaktinformationen irgendwelcher Art, die sich bis zu einen gewissen Grad mit denen einer natürlichen Person decken.
David ist offline   Mit Zitat antworten
Alt 13.04.2009, 12:07  
Benutzer
 
Registriert seit: 04.05.2008
Beiträge: 77
ghost120 befindet sich auf einem aufstrebenden Ast
Standard

Wenn ich das ganze so mit nem LEFT JOIN mache, dann geht es viel schneller:
PHP-Code:
SELECT schaden.IDschaden.Schadennrschaden.Polizzennr,
schaden.Vermnrschaden.SpartenCdschaden.Ereigniszpkt
k.Vornamek.Familiennamek.Name
FROM schaden
vertrag vtg
LEFT  JOIN kunden k ON vtg
.VN k.Personennr
WHERE schaden
.BearbStandCd =  "O"
AND schaden.Polizzennr vtg.Polizzennr
ORDER  BY schaden
.Ereigniszpkt 
Allerdings verstehe ich nicht ganz warum, nur bei dieser Tabelle...

</span></span>
ghost120 ist offline   Mit Zitat antworten
Alt 13.04.2009, 12:25  
Erfahrener Benutzer
 
Benutzerbild von David
 
Registriert seit: 05.09.2007
Beiträge: 5.044
David wird schon bald berühmt werden
Standard

Lies Dir mal MySQL :: MySQL 5.0 Reference Manual :: 7.2.1 Optimizing Queries with EXPLAIN durch.
David ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Abfrage über drei Tabellen Bruz Datenbanken 3 31.10.2008 19:27
in einer abfrage ermitteln ob mehrere tabellen existieren? litterauspirna Datenbanken 7 28.10.2008 19:33
abfrage über mehrere tabellen mit einer bedingung DarkThunder PHP Tipps 2007 6 15.04.2007 17:13
Abfrage über drei und mehr Tabellen querfisch Datenbanken 3 27.03.2007 21:12
Abfrage über 3 Tabellen madSoul Datenbanken 5 26.06.2006 12:25
SQL ABfrage über mehrere Tabellen Madden Datenbanken 17 09.05.2006 21:19
Abfrage aller Tabellen über Schleife PHP Tipps 2005-2 7 22.10.2005 12:16
[Erledigt] MySQL Abfrage über mehrere Tabellen [Erledigt] Datenbanken 2 14.10.2005 13:37
mysql abfrage über 4 Tabelle - bis 3 geht, bei der 4. habert Datenbanken 2 08.09.2005 11:59
Mysql Abfrage über 3 Tabellen in Verbidung mit COUNT() Datenbanken 8 29.06.2005 04:15
Mysql Abfrage über 3 Tabellen in Verbidung mit COUNT() PHP Tipps 2005-2 4 28.06.2005 07:47
[Erledigt] MySQL Abfrage aus mehreren Tabellen Datenbanken 1 12.04.2005 17:53
[Erledigt] Suche über 2 Tabellen in MySQL PHP Tipps 2004-2 4 15.12.2004 16:05
über PHP Daten in MySQL Tabellen updaten -- Problem PHP Tipps 2004 4 27.09.2004 21:34
Über PHP Script 2 MySQL Tabellen abgleichen PHP Tipps 2004 0 20.09.2004 09:32

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql if, polizzennr. herausfinden, abfrage über fünf tabellen mysql, familienname kunde, mysql abfrage 5 tabellen, mysql und aus 5 tapellen, datenbank sql abfrage über 5 tabellen, abfrage aus mehr als 5 tabellen, mysql abfrage über 5 tabellen, \or die\ mysql if, mysql leere felder tabellendesign, abfrage mit 5 tabellen, abfrage über 5 tabellen, mysql 5.0 if bedingungen query auswählen, mysql \insert into\ and if, datenbank mit 5 tabellen, mysql, mysql abfrage mit 5 tabellen, php, mysql, if,mehrere abfragen

Alle Zeitangaben in WEZ +1. Es ist jetzt 15:21 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum