Announcement

Collapse
No announcement yet.

Statt 50 Abfragen eine view?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Statt 50 Abfragen eine view?

    hallo zusammen,

    bin neu hier und ein bisschen am verzweifeln...

    ich habe eine tabelle "mitarbeiter" eine tabelle "eigenschaften" und eine tabellle mitarbeiter_eigenschaften

    hier ein auszug aus der tabelle mitarbeiter:

    [mid] [vorname] [nachname] [ort] [plz] [...]

    hier ein auszug aus der tabelle eigenschaften

    [eid] [bezeichnung] [art]


    tabelle mitarbeiter_eigenschaften

    [meid] [mid] [eid] [text_wert] [zahlen_wert]

    so jetzt zu meinem problem.
    ich greife mittels php auf die datenbank zu - soweit sogut hier mal ein programm auszug

    select * from mitarbeiter

    [schleife über mitarbeiter]

    select * from eigenschaften

    [schleife über eigenschaften]

    select *
    from mitarbeiter eigenschaften
    where mid = $mid and eid = $eid

    [wenn wert vorhanden]
    wert ausgeben
    [sonst]
    leer
    [ende wenn]
    [ende schleife eigenschaften]
    [ende schleife mitarbeiter]
    das programm arbeitet an sich sehr schnell. das problem ist jedoch, dass es für jede eigenschaft die ein mitarbeiter haben _könnte_ eine sql abfrage startet. und hier geht viel zeit verloren da wir über 50 eigenschaften haben...

    wo ich auf dem schlauch stehe ist folgendes:
    meist stehen ja alle parameter zu einem mitarbeiter in EINER zeile und X spalten.. bei mir ist es jedoch anders rum X zeilen und EINE spalte..
    daher die frage ob ich direkt in der datenbank irgendwas "bauen" kann, damit ich pro mitarbeiter nur eine zeile auslesen muss? ein view zb??

    vielen dank für tipps oder hinweise...

    ps. in wirklichkeit sind es keine select * anweisungen..


    grüße
    maria

  • #2
    Ich würde das mal anders betrachten, und zwar: eine Ausgabe erfolgt nur, wenn ich Daten in der mitarbeiter_eigenschaften Tabelle habe. Also nehme ich die als Ausgangsbasis und hole mir die anderen Daten bezüglich Eigenschaft und Mitarbeiter dazu. Dadurch können Schleifen komplett entfallen. Sieht dann etwa so aus:

    select m.mid, m.vorname, m.nachname, e.eid, e.bezeichnung.e.art, m_e.zahlen_wert
    from mitarbeiter_eigenschaften m_e
    left join mitarbeiter m on m.mid = m_e.mid
    left join eigenschaften e on e.eid = m_e.eid
    order by m.nachname, e.bezeichnung, ...

    Solltest du auch für Mitarbeiter/Eigenschaften ohne Eintrag in m_e einen Datensatz in der Ausgabe brauchen, musst du einen "outer join" statt dem "left join" verwenden.

    bye,
    Helmut

    Comment


    • #3
      hallo helmut,

      danke für deinen tipp.. jedoch löst dieser mein problem nicht so ganz..

      meine frage ist, ob (zb durch einen view) folgendes ergebnis möglich ist:

      Code:
      Tabelle Mitarbeiter
      
      [mid] [vorname] [nachname] [ort]     [plz] [...]
      2        peter        müller           berlin  0000
      4        ulrike        schmidt         berlin  0000
      
       tabelle eigenschaften
      
      [eid] [bezeichnung] [art] 
      1      gehalt               zahl
      2      alter                  zahl
      3      kinder               zahl
      4      verheiratet       text
      5      diplom              text
      
      mitarbeiter_eigenschaften
      
      [meid] [mid] [eid] [text_wert] [zahlen_wert]
      1         2        1                         3500
      2         2        2                         54
      3         2        3                          2
      4         4        1                         3200
      5        4         2                         37
      
      
      Ergebnis:
      
      [mid] [vorname] [nachname]  [alter] [kinder] [verheiratet] [gehalt] [diplom] [...]
      2        peter        müller           54         2          ja                  3500     isnull
      4        ulrike        schmidt         37        1           ja                 3200     isnull

      Comment


      • #4
        Ja das ist möglich, ich würde dir eine User defined function empfehlen, da du mit dieser den Ausgabestring recht frei zusammensetzen kannst. Ein normales SQL Statement wird für dein Ergebnis ziemlich kompliziert, da du ja mit einer mitarbeiter-Spalte mehrere Eigenschaften-spalten ansprechen willst.

        Außerdem kannst du damit die Last zum Server geben und hast nicht noch jedesmal die Netzwerklatenzzeit im Nacken, die die Anzeige der Ergebnisse verzögert.

        Die Funktion sollte schematisch so laufen:

        für jeden Mitarbeiter in Mitarbeiter suche id heraus

        für jede Eigenschaft in Eigenschaften tue folgendes: (beachte die
        Reihenfolge!)

        suche die Mitarbeiterid und Einegnschaftenid in den Mitarbeiter-
        Eigenschaften

        if vorhanden: setze den Ausgabestring zusammen
        else: füge null in den Ausgabestring ein

        gib Ausgabestring zurück

        Die Abfragen aus der Mitarbeiter-Eigenschaften Tabelle kannst du mittels Cursor oder temporärer Tabelle holen wobei ich eher auf die ttable zurückgreifen würde da man Cursor nur dann benutzen solte wenn es nicht anders geht.

        Ich kann dir das Problem leider nicht lösen da ich zZ auf Arbeit sitze, aber probier es mal und wenns Probleme gibt poste einfach nochmal !

        Viel Erfolg

        Comment

        Working...
        X