Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
wie umgehe ich unterabfragen am besten?? (mysql) [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr
brauche Webseite ideal für Vereine und Firmen
- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
wie umgehe ich unterabfragen am besten?? (mysql)


 
Thommy
24-11-2001, 18:27 
 
Hallo an alle,

hab ein Problem mit einer my-sql abfrage (welcher eigentlich ne Unterabfrage enthält). Ich zeig euch mal ein kleines Beispiel meines Problems.

Ich habe zunächst eine

Tabelle 1, welcher Daten von Personen enhält (also z.B. folgende Felder: Nachname, Vorname, Geburtsdatum)

Tablle 2 enhält nun die Fremdsprachenkenntnisse dieser Personen (also z.B. folgende Felder: Französisch, Englisch, Spanisch)

Nun möchte ich eine Abfrage starten, die mir alle Personen zeigt welche Schmidt heißen und Englisch können. (die eigentlich Datenbank is noch viel umfangreicher - so dass ich auch Abfragen dieser Art brauche welche über 4-5 Tabellen gehen - ist also nur ein kleines Beispiel)

Wie würdet ihr das machen?


Riesen Dankeschön im vorraus!!!!


Thommy

 
Sky
24-11-2001, 19:18 
 
Wie würdet ihr das machen?
Eiegntlich gar nicht so... Warum benutzt du denn zwei Tabellen dafür? Alle Infos über eine Person können doch in eine Tabelle.

Aber wenn du möchtest:

SELECT rows FROM daten,fskenntnisse WHERE daten.nachname='Schmidt' AND fskenntnisse.englisch='1'

 
Thommy
25-11-2001, 10:23 
 
Danke,

ich glaub das könnt ich hinkriegen - ansonsten meld ich mich halt nochmal :-)


Gruss


Thommy

 
Titus
27-11-2001, 21:55 
 
Dann ist doch die ganze Normierung futsch!!!!

Benutz left join statt normaler Verknüpfungen ... das geht um einiges schneller, und die DB bleibt normiert.

also:
select User.* from User U
left join Sprachkenntnisse S on S.USER_ID=U.ID
where U.NAME='Schmidt' and S.SPRACHE='Englisch'


Nachtrag@Sky: Du hast die Verknüpfung der Tabellen "daten" und "fskenntnisse" vergessen.

 
Sky
28-11-2001, 14:48 
 
Ja, hab ich vergessen... Aber DB-Normierung ist das ja nicht, was er da macht, denn das müsste doch meiner Meinung nach so aussehen:


table user
name | sprach_id
schmidt | 1

table fskenntnisse
id | bezeichnung
1 | Englisch


Oder habe ich das jetzt verplant...?

 
Blaster
28-11-2001, 15:10 
 
Weil ihr gerade davo sprecht:

Ich erziele oft mit der Formulierung

SELECT DISTINCTROW * FROM User AS A,fskenntnisse AS B WHERE A.spach_id=B.fskenntnisse

eine bessere Laufzeit-Betrachtung als durch eine INNER (LEFT) JOIN -Formulierung.

Weiß einer wieso?!

Blaster

 
Titus
28-11-2001, 18:08 
 
ah so ... war davon ausgegangen, dass manche Menschen mehrere Fremdsprachen beherrschen.

darum dachte ich

Leutz: ID, Name
Sprachen: ID, Name
Sprachkenntnisse: Leutz_ID,Sprach_ID

und in dem Fall wäre ein left join schneller als die distinctrow-Query.

 
Blaster
28-11-2001, 18:23 
 
Ja,sollte man meinen!

Bei einer 1:1 - Beziehung - kein Thema!. Aber bei einer 1:n -Beziehung erziele wiedersprüchliche Resulte. Vermute hat etwas Tabellenanordnung und zu erwartene Hits zu tun.

Leider habe ich zu wenig Ahnung von JETs um weiter nachzuvollziehen. Deshalb die Frage.


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:55 Uhr.