sunny: SQL-Abfrage aus vielen Tables zur Ausgabe einer einzigen Tabelle

Hallo zusammen!

Habe schon sehr lange nichts mehr im Webbereich gemacht und bin jetzt gerade etwas unsicher mit einer Webseite, die ich erstellen soll.

Es geht um eine Seite, welche ein Tabelle ausgeben soll, die Inhalte einer MySQL Datenbank wiedergibt.

In vereinfachter Form sollte diese Tabelle so in etwa aussehen:

-----------------------------------------------------------------------
e-id       g-name       S1       S2       S3       q       p       aM
-----------------------------------------------------------------------
1
2
3
4
...
-----------------------------------------------------------------------

Natürlich mit jeweils Inhalten. Ich möchte das mit PHP lösen.

Die kleine Schwierigkeit an der Sache ist, dass für die mittleren Spalten (S1 usw.) die Daten nicht so direkt vorliegen. Alles andere könnte ich mit einem gewöhnlichen SQL-Statement und zeilenweiser Schleife zum Ausgeben der Daten lösen.

Einfacher wäre es, wenn es in der DB eine Tabelle gäbe, wo schon die Spalten S1 bis S3 (in Wahrheit sind es mehr) enthalten wären. Es ist aber so, dass diese Information, welcher Wert zu welchem S gehört, nur über einen Fremdkey erhalten wird.

Also zum leichteren Verständnis hier mal ein Auszug des DB-Designs:

Einträge für Spalte e-id:

---------------
e
---------------
pk  e-id
fk  c
---------------

Einträge für Spalte g-name:

---------------
g
---------------
pk  g-name-id
fk  e-id
    g-name
---------------

Einträge für Spalte S1 - S3:

---------------
M
---------------
pk  M-id
fk1 S
fk2 e-id
    M
---------------

Einträge für aM, q und p:

---------------
Meta
---------------
pk  Meta-id
fk1 e-id
    aM
    p
    q
---------------

Weitere Tabellen:

---------------
S
---------------
pk  S
    x-id
    x
---------------

...

Das ist alles verkürzt und ein bisschen umbenannt, sonst wird das hier zu umfangreich.

Meine Frage jetzt: Wird das kompliziert, mit diesem DB-Design so eine Ausgabe zusammenzubekommen? Muss ich da, zumindest für die S-Spalten, dann innerhalb der Abfrage noch eine Abfrage schachteln? Oder geht das doch auch ganz einfach mit Joins?

Notfalls könnte man das DB-Design wohl auch abändern, aber ich denke, das ist schon ganz gut so (kommt nicht von mir). Bin nur unsicher bezüglich der Abfragen. Bin so überhaupt nicht mehr in der Materie drin. Vielleicht kann mir jemand ein wenig auf die Sprünge helfen.

Liebe Grüße
sunny

  1. Hallo,

    Also zum leichteren Verständnis hier mal ein Auszug des DB-Designs:

    leichter verständlich wären ein paar Beispieldaten und die richtigen Tabellen- und Spaltennamen, damit man sich darunter etwas vorstellen kann ...

    Einträge für Spalte e-id:


    e

    pk  e-id
    fk  c

    Das ist alles verkürzt und ein bisschen umbenannt, sonst wird das hier zu umfangreich.

    ... statt bis zur Unkenntlichkeit und Unverständlichkeit verstümmelter Angaben.

    Meine Frage jetzt: Wird das kompliziert, mit diesem DB-Design so eine Ausgabe zusammenzubekommen?

    vermutlich nein.

    Muss ich da, zumindest für die S-Spalten, dann innerhalb der Abfrage noch eine Abfrage schachteln? Oder geht das doch auch ganz einfach mit Joins?

    das sollte vermutlich sowohl mit Joins als auch mit Subselects zu lösen sein. Ich sehe kein besonderes Problem außer dem, Dein Problem mit Deinen Angaben nachzuvollziehen.

    Freundliche Grüße

    Vinzenz

    1. Hallo!

      Also zum leichteren Verständnis hier mal ein Auszug des DB-Designs:

      leichter verständlich wären ein paar Beispieldaten und die richtigen Tabellen- und Spaltennamen, damit man sich darunter etwas vorstellen kann ...
      ... statt bis zur Unkenntlichkeit und Unverständlichkeit verstümmelter Angaben.

      Okay, ich dachte eigentlich, dass es verkürzt einfacher zu verstehen wäre als wenn ich die Gesamtstruktur hier einfach reinklatsche.
      Aber dann mal das vollständige DB-Design:

      ---------------
      Groups
      ---------------
      pk  GroupId
          GroupName
          Description
          Size
      ---------------

      ---------------
      Question
      ---------------
      pk  QuestionId
          Description
      fk1 Group1
      fk2 Group2
      ---------------

      ---------------
      Study
      ---------------
      pk  StudyId
          pubmedId
          Platform
      ---------------

      ---------------
      M
      ---------------
      pk  MId
      fk1 StudyId
      fk2 QuestionId
      fk3 EntrezId
          M
      ---------------

      ---------------
      p
      ---------------
      pk  pId
      fk1 StudyId
      fk2 QuestionId
      fk3 EntrezId
          p
          q
      ---------------

      ---------------
      Meta
      ---------------
      pk  MetaId
      fk  EntrezId
          aM
          aMW
          p
          q
      ---------------

      ---------------
      Entrez
      ---------------
      pk  EntrezId
      fk  Chromosome
      ---------------

      ---------------
      Chromosome
      ---------------
      pk  Chromosome
      ---------------

      ---------------
      GSymbol
      ---------------
      pk  SymbolId
      fk  EntrezId
          GSymbol
      ---------------

      Ausgabe:

      Etwa so wie hier (das war ein Demo wo die dahinterliegende Datenbankstruktur noch nicht ganz so generisch war und es daher einfach mit 2 Joins in einem einzigen SQL-Statement zu lösen war):

      ...

      In einer solchen Datenbank-Tabelle werden zu Beginn bis zu etwa 20.000 Einträge stehen, was sich aber später noch stark erweitern wird. Daher auch meine Unsicherheit bezüglich der Lösungsmöglichkeit mit Joins oder Unterabfragen usw. Das Ganze soll ja halbwegs performant sein. Joins wären da wohl besser. Ich bin mir unsicher, wie das mit den Joins für den mittleren Bereich der Tabelle (S1 bis S27) funktionieren kann. Das wird dann wohl ein recht langes Statement ...

      Ich weiß nicht, ob es jetzt verständlicher ist, ich hoffe es. Hatte mich eigentlich bemüht, es abzukürzen um nur das relevante Teilproblem darzustellen. Ist mir wohl nicht richtig gelungen.

      Liebe Grüße
      sunny