wie umgehe ich unterabfragen am besten?? (mysql)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • wie umgehe ich unterabfragen am besten?? (mysql)

    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
    www.unister.de

    what students want!

  • #2
    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'

    CAT Music Files

    Kommentar


    • #3
      Danke,

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


      Gruss


      Thommy
      www.unister.de

      what students want!

      Kommentar


      • #4
        BLOSS NICHT!!!!

        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.
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          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:

          Code:
          table user
          name    | sprach_id
          schmidt | 1
          
          table fskenntnisse
          id | bezeichnung
          1  | Englisch
          Oder habe ich das jetzt verplant...?

          CAT Music Files

          Kommentar


          • #6
            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
            Yuppi, endlich Elite ...

            Kommentar


            • #7
              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.
              mein Sport: mein Frühstück: meine Arbeit:

              Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

              Kommentar


              • #8
                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.
                Yuppi, endlich Elite ...

                Kommentar

                Lädt...
                X