Ankündigung

Einklappen
Keine Ankündigung bisher.

verschachtelte Datenbankabfragen

Einklappen

Neue Werbung 2019

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

  • verschachtelte Datenbankabfragen

    Hallo guten Abend,
    ich hoffe, jemand kann mir bei meinem Problem weiterhelfen. Für den Fall, dass sich jemand am Umfang dieses Post's stört, dem sei gesagt, dass ich sonst nicht weiß, wie ich einem Fachmann mein Problem beschreiben soll

    Ich lasse mir über ein Suchformular Praxislisten erstellen, deren Auswahlkriterien ich über ein Formular definiere. Das Ganze ist bereits im Einsatz und funktioniert auch so wie gewünscht (siehe unten).

    Bis dato wurden die angeforderten Praxisdaten aus der Tabelle ‚praxen‘ gezogen. Alle Praxen in der Tabelle ‚praxen‘ sind mit nur einer fachrichtungen_id notiert
    Tabelle ‚praxen‘
    praxis_id fachrichtungen_id
    5 1
    8 23
    9 26
    11 23
    14 15
    15 12
    16 11
    Nun habe ich eine neue Tabelle erstellt ‚praxen_diverse_fachrichtungen_id ‘.
    In dieser Tabelle liste ich z.B. Kliniken oder die Praxen auf, die mehrere Fachrichtungen im Haus haben.

    Tabelle ‚praxen_diverse_fachrichtungen_id‘
    praxis_id fachrichtungen_id
    999 1
    999 23
    99 26
    77 23
    77 15
    77 12
    77 11
    44 23
    44 15

    Mein Problem verdeutliche ich besten an diesem Beispiel:
    Ich will mir alle Praxen der Fachrichtung Neurologie ( fachrichtungen_id = 23) anzeigen lassen. Bei meiner bisherigen Vorgehensweise hat er mir auch alle neurologischen Praxen korrekt aufgelistet, die in der Tabelle ‚praxen‘ mit der entsprechenden ‚fachrichtungen_id‘ gespeichert sind.

    Nun sollen mit dieser einen Abfrage zugleich auch die Kliniken angezeigt werden, die in der Tabelle ‚praxen_diverse_fachrichtungen_id ‘ gelistet sind und einen Eintrag ‚fachrichtungs_id‘ für Neurologie (23) aufweisen.
    Einzeln würde ich das so abfragen, steht aber hier nicht zur Debatte:

    PHP-Code:
    SELECT
                pdf
    .praxis_idpdf.fachrichtungs_id
    FROM praxen_diverse_fachrichtungen_id pdf
    WHERE pdf
    .fachrichtungs_id 23 

    Mein Problem ist nun, dass ich nicht weiß, wie und wo ich die Abfrage in meine bisherige Abfrage korrekt einbaue.
    So sieht meine funktionsfähige Abfrage zur Zeit aus:


    PHP-Code:
    SELECT
                p
    .id,     p.name AS namep.ortp.fachrichtungp.praxistyp,
                
    p.gesperrt,
                
    f.name AS fname,
                
    t.name AS praxistyp,  
                
    k.kvname,

         (
    SELECT GROUP_CONCAT(a.titel,   a.name SEPARATOR '<br> ')   FROM aerzte a WHERE p.id a.praxis_id) AS aerzte,


        
    a.praxis_id,  a.anrede AS aanrede,
      
    m.praxen_idm.post AS postmailingm.fax AS faxmailingm.email AS emailmailingm.veranstaltungen_uebersichtm.veranstaltungen_id        

    FROM praxen p
    LEFT JOIN fachrichtungen f ON  f
    .id p.fachrichtung
    LEFT JOIN praxen_typus t ON praxistyp 
    t.id
    LEFT JOIN praxen_kvbezirk k ON kvpraxis 
    k.id
    LEFT JOIN aerzte a ON p
    .id a.praxis_id
                JOIN 
    (SELECT praxen_idMAX(datum) AS datumpostfaxemailveranstaltungen_uebersichtveranstaltungen_id
              FROM mailing GROUP BY praxen_id
    m  ON m.praxen_id p.id


    WHERE p
    .fachrichtung 23 

    Die Unterabfrage (egal ob mit IN oder =) funktioniert nicht, weil es mehr als ein Ergebnis gibt (MySQL meldet:#1241 - Operand should contain 1 column(s), bei einem anderen Versuch zeigte er mir nur die Praxen, deren praxis_id in beiden Tabellen zu finden sind. Wenn das mit EXISTS funktionieren könnte, weiß ich eben nicht, wo und wie das einzubauen ist. Kann mir jemand helfen? Gruß Marie
    PHP-Code:
    SELECT
            p
    .id,   p.name AS namep.name_zusatzp.ortp.stadtteilp.kvpraxis,  p.plzp.faxvp.fax,  p.emailp.fachrichtungp.praxistyp,
        
    p.gesperrt,
            
    f.name AS fname,
            
    t.name AS praxistyp,  
            
    k.kvname,

    // ###########################
            
    (SELECT pdf.praxis_idpdf.fachrichtungen_id FROM praxen_diverse_fachrichtungen_id pdf where pdf.fachrichtungen_id IN ('23')) AS zusaz ,
    // ###########################      

            
    (SELECT GROUP_CONCAT(a.titel,   a.name SEPARATOR '<br> ')   FROM aerzte a WHERE p.id a.praxis_id) AS aerzte,

        
    a.praxis_id,  a.anrede AS aanrede,
            
    m.praxen_idm.post AS postmailingm.fax AS faxmailingm.email AS emailmailingm.veranstaltungen_uebersichtm.veranstaltungen_id  

    FROM praxen p
    LEFT JOIN fachrichtungen f ON  f
    .id p.fachrichtung
    LEFT JOIN praxen_typus t ON praxistyp 
    t.id
    LEFT JOIN praxen_kvbezirk k ON kvpraxis 
    k.id
    LEFT JOIN aerzte a ON p
    .id a.praxis_id
            JOIN 
    (SELECT praxen_idMAX(datum) AS datumpostfaxemailveranstaltungen_uebersichtveranstaltungen_id
    WHERE p
    .fachrichtung 23 


  • #2
    Hilfreich wäre ein SQL-Export als Quelltext, damit man, wenn man Lust hat sich das anzusehen, wenigstens nicht die Tabellen einhakken muss.
    bitcoin.de <- Meine Freelancerwährung

    Kommentar


    • #3
      Alle Praxen in der Tabelle ‚praxen‘ sind mit nur einer fachrichtungen_id notiert

      Nun habe ich eine neue Tabelle erstellt ‚praxen_diverse_fachrichtungen_id ‘.
      In dieser Tabelle liste ich z.B. Kliniken oder die Praxen auf, die mehrere Fachrichtungen im Haus haben.
      Ich denke dein DB-Design ist nicht korrekt. Warum hast du da zwei Tabellen für Praxen? Es reicht doch eine Tabelle mit den Praxen, eine mit Fachrichtungen und eine Verbindungstabelle. Ob eine Praxis dann eine, zwei oder zehn Fachrichtungen hat stellt man dann im Zuge der DB-Abfrage fest und von der reinen Datenhaltung her völlig ident zu behandeln.


      [MOD: Verschoben von PHP-Einsteiger]
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Das einfachste wäre, per Union nochmal die gleiche Abfrage, aber bezogen auf die praxen_diverse_fachrichtungen an die bestehende Abfrage anzuhängen.

        Sinnvoller ist, das Schema auf die neue Anforderung hin zu korrigieren.

        Dafür müsstest du nur
        - alle Einträge die aktuell in 'praxen' sind in die Tabelle 'praxen_div...' einfügen (Wenn sie dort noch nicht vorhanden sind)
        - 'praxen_dive...' umbenennnen, weil sie jetzt ja auch Praxen mit nur einer Fachrichtung enthält
        - in deinen Abfragen die alte Tabelle durch die neue ersetzen

        Vielleicht wäre ein besserer Name für die Tabelle 'praxenfachrichtungen' oder so (falls es da keinen Fachbegriff zu gibt). Aktuell enthält die Tabelle ja scheinbar nur die Zuordnungen, beim Namen 'praxen' würde ich eher die Stammdaten der Praxen als Inhalt erwarten.
        [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
        [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

        Kommentar


        • #5
          Hallo,
          vielen Dank für Eure Rückmeldungen und bitte entschuldigt meine verspätete Rückmeldung.
          Hausl, ich glaube, Du hast Recht. Ich sollte nicht an der Abfrage arbeiten, sondern mein DB-Design überprüfen. Eigentlich naheliegend und wenn ich alles richtig verstanden habe, wäre hoffentlich diese Anpassung korrekt oder?
          meine Tabelle 'praxen' enthält alle Stammdaten der Praxen/Kliniken und enthält keine Informationen mehr zur Fachrichtung
          meine Tabelle 'praxis_fachrichtungen' enthält dann zwei Spalten fachID und praxisID - somit können einer Praxis/Klinik von einer bis unendlich vielen Fachrichtungen zugeordnet werden
          meine Tabelle 'fachrichtungen' enthält die fachID und die Fachrichtung ausgeschrieben z.B. Neurologie etc.
          Damit dürfte sich ja dann auch meine Frage erübrigen.

          Hausl Du hast eine Verbindungstabelle erwähnt, ist das noch etwas anderes oder habe ich die in meinem oben beschriebenen Modell und nenne sie nur nicht so?

          Kommentar


          • #6
            Das passt so.. Die mit den "zwei Spalten" ist das.
            The string "()()" is not palindrom but the String "())(" is.

            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar

            Lädt...
            X