SQL-Abfrage aus vielen Tables zur Ausgabe einer einzigen Tabelle
sunny
- datenbank
1 Vinzenz Mai0 sunny
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
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
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