JOIN Abfrage über mehrere Tabellen

Generic1

Top Contributor
Hallo,

meine DB- Kenntnisse sind schon ein bisschen verstaubt und deshalb hätte ich eine Frage in diese Richtung, und zwar hab ich folgendes DB- Schema:

generic1-albums-dbschema-picture187-dbschema.png


Von der Event- zum Teilnehmer - Tabelle und von der Teilnehmer- Tabelle zur Bezahlung- Tabelle besteht eine m:n- Beziehung (Also ein Teilnehmer kann an mehreren Events teilnehmen und kann/muss natürlich für die Events Eintrittsgeld bezahlen).

Meine Frage wäre jetzt, ob es möglich ist herauszufinden, ob ein Teilnehmer, welcher an einem bestimmten Event teilnimmt, schon bezahlt hat oder nicht, also:

Code:
Event        (m:n)          Teilnehmer       (m:n)      Bezahlung
----------------------------------------------------------
Ausstellung1                Hans Huber                      €0
Ausstellung2                Walter Meier                    €15

Also ich bräuchte eine SQL- Abfrage, welche mir ausgibt ob z.B.: der Herr Hans Huber für die Ausstellung1 schon bezahlt hat.

Ich weiß jetzt, dass das mit Joins gehen muss aber mir ist nicht mehr klar, wie ich das machen kann.

lg
Generic1
 
Zuletzt bearbeitet:

Generic1

Top Contributor
OK, Join über 2 Tabellen, welche mit m:n verbunden sind ist klar, aber wie kann ich die Joins dann über 3 Tabellen machen?
lg und besten Dank,
lg
 
S

SlaterB

Gast
mit direkt verknüpften Tabellen syntaktisch vielleicht fraglich,
das würde ich eh nicht am Anfang empfehlen (auch wenn vielleicht durch den Link getan)

die allgemeine Variante dürfte doch bekannt sein:
Code:
select a.g, b.r, d.z  // Auswahl
from A a, B b, C c, D d // Tabellen
where a.a = b.a and b.b = c.b and c.d = d.d // Verknüpfung der Tabellen
and a.x = 4 und c.y = 'heute' // sonstige Selektion
 
G

Gast2

Gast
Erm... in dem Schema oben sehe ich gar keine Relation zwischen den Tabellen? Hast du da noch kreuztabellen zwischen oder eine der Splaten mit den relevanten Keys einfach ausgelassen?
 

Generic1

Top Contributor
Erm... in dem Schema oben sehe ich gar keine Relation zwischen den Tabellen? Hast du da noch kreuztabellen zwischen oder eine der Splaten mit den relevanten Keys einfach ausgelassen?


bei den Relationen steht eh m:n!

eine Frage hätte ich noch zu diesem Thema, wenn ich folgenden 3 Tabellen habe:

Code:
Event              m:n                Teilnehmer              1:n                    Ergebnisse
Düsseldorf                             Hans Meier                                          4:45h
Dortmund                              Walter Müller                                       3:34h
                                                                                          2:40h

Also Hans Meier hat in Düsseldorf mitgemacht (z.B. Oltimerrennen) und hat 4:45h benötigt.
Walter Müller hat in Düsseldorf mitgemacht und 3:34h benötigt und hat auch in Dortmund mitgemacht und hat dort 2:40h benötigt.
Kann ich da mit einer SQL- Abfrage herausbekommen, wie lange Walter Müller z.B.: in Dortmund benötigt hat oder muss ich in der Tabelle "Ergebnisse" noch eine Spalte mit dem Eventnamen hinzufügen?
Besten Dank,
lg
 
S

SlaterB

Gast
da brauchst du die dritte Verknüpfung,
wobei das ganze sinnvoller eh anders aufgebaut wäre:

Code:
Event: Id, Name, Zeit  ------ Teilnahme/ Ergebnis: EventId, MenschId, Zeit  ------   Mensch: Id, Name, Alter

Teilnahme wäre dann exakt die n:m-Beziehnung zwischen Event und Mensch, hier bräuchte es keine zusätzlichen Tabellen
 

Generic1

Top Contributor
OK, stimmt, und ob ein "Mensch" bezahlt hat für einen Event, könnte ich dann auch in die Relationstablelle (Teilnahme) geben, oder wäre das keine gute Idee?

Und eine weitere Info würde mir da einfallen welche ich in die Relationstabelle geben könnte -> der Modus (also 10km, 50km, usw.)?
Dann wäre die Relationstabelle aber ziemlich aufgeblasen, ist das dann noch ok?
lg
 
Zuletzt bearbeitet:

Generic1

Top Contributor
Da kommt mir dann gleich die nächste Frage in den Sinn, kann ich den eine Relationstabelle mit Hibernate erzeugen, welche außer den Relationen noch andere Spalten hat,
In meine jetzigen Applikation (öffensichtlich mit dem falschen DB- Schema) habe ich nur die relationen von 2 Tabellen (bei m:n- Verbindungen).

Ist das überhaupt möglich mit Hibernate?
lg und danke nochmals,
 
S

SlaterB

Gast
ich denke schon dass das möglich ist, allerdings interessiere ich mich überhaupt nicht für automatische Erzeugung oder besonders komplizierte Mappings, kann da nicht weiterhelfen,
bei mir wäre Teilnahme eine komplette eigene Entity mit Java-Klasse, Links auf die anderen beiden Entities
 

Generic1

Top Contributor
Hallo nochmal,

ich habs jetzt versucht, auch so zu machen dass ich eine eigene Entity als Relationstabelle zwischen Event und Participant mache mit dem Namen Participance.
Ich bin mir jetzt aber überhaupt nicht sicher, ob das funktioniert, die Entity- Klasse Event kann jetzt alle zu einem Eventeintrag zugehörigen Participance holen und ein Participant kann auch alle zugehörigen Participance abfragen.
Mir ist jetzt aber nicht klar ob das funktioniert, dass ich zu einem Participant alle zugehörigen Participance und den dazugehörigen Event abfrage kann. Ich hab ja da jetzt eine Beziehung die so ausschaut:

Code:
Event         1:n               Participance           n:1             Participant

also, all Participance für einen Participant und alle Participance für einen Event müsste leicht abzufragen sein, aber den Event für einen Participant mit allen Participance -> geht das dann auch mit HQL?
Vielen Dank,
lg

Java:
@Entity
@SuppressWarnings("serial")
@Table(name="TEvent")
public class Event implements Serializable {

    private Integer pk_event;
    private String eventname;
    private Timestamp eventtime;
    private int fk_participance;
    private List<Participance> participances;

    public Event() {
        }

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public Integer getPk_event() {
        return pk_event;
        }

    public void setPk_event(final Integer pk_event) {
        this.pk_event = pk_event;
        }

     /* 1:n relation */
  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)  
  @JoinColumn(name="fk_participance")
  public List<Participance> getParticipance() {
        return participances;
        }

  public void setParticipance(final Participance participance) {
        this.participances.add(participance);
        }

...

Java:
@Entity
@Table(name="TParticipance")
public class Participance implements Serializable {

    private Integer id_participance;

// ab da ist diese Entity eine POJO ohne Annotations

Java:
@Entity
@SuppressWarnings("serial")
@Table(name="TParticipant")
public class Participant implements Serializable {

  private Integer pk_part;
  private String firstname;
  private String surname;
  private int fk_participance;
  private List<Participance> participances;
  
  public Participant() {
    }

  @Id
  @GeneratedValue(generator="foreign")
  @GenericGenerator(name="foreign", strategy = "foreign", parameters={
        @Parameter(name="property", value="contact")
        })
  public Integer getPk_part() {
        return pk_part;
        }

  public void setPk_part(final Integer pk_part) {
        this.pk_part = pk_part;
        }

  /* 1:n relation */
  @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)  
  @JoinColumn(name="fk_participance")
  public List<Participance> getParticipance() {
        return participances;
        }

  public void setParticipance(final Participance participance) {
        this.participances.add(participance);
        }
 
Zuletzt bearbeitet:
S

SlaterB

Gast
im Zweifel geht in HQL immer der ganz normale Join,
statt Ids kann man dann Objekte verwenden bzw. muss wenn die Ids nicht extra gemappt sind

Code:
from Event e,  Participance c, Participant p
where c in e.participances and c in p.participances
müsste gehen, bzw. besser
Code:
from Event e,  Participance c, Participant p
where e = c.event and p = c.participant
sofern auch in diese normalere Richtung korrekt gemappt

gibt noch komplizierte Schreibweisen mit INNER JOIN, aber die kenne ich selber nicht wirklich
und hab eigentlich schon mehr erzählt als durch Lernen zu lernen wäre
 

Generic1

Top Contributor
Hallo,

eine letzte Frage hätte ich noch zu diesem Thema, erscheint das für dich logisch bzw. würdest du das auch so machen, dass ein "Participant" eine @OneToMany- Relation zu "Participance" und das "Event" auch eine @OneToMany- Relation zu "Participance" hat?

Ich frag mich nämlich gerade, wie ich einen Participant für einen Event speichere (über die Tabelle Participance). Also mir ginge es nur mehr um die Vorgehensweise, wie z.B.:

1. schaun obs den Event, für den sich der Participant registrieren will, schon gibt.
2. wenn ja, dann das Event- Objekt holen
3. Participance- Objekt eintragen
4. Participance- Objekt in Event- Objekt setzen
5. Participant in Tabelle eintragen (sollte es den noch nicht geben, ansonsten dieses Participant- Objekt holen)
6. Participance- Objekt in Participant- Objekt setzen.

Würde das so Sinn machen oder gäbe es da einen einfacheren/schnelleren/performanteren Weg?
lg
 
S

SlaterB

Gast
mir gefällt die einfache Richtung im Allgemeinen besser: Participance verweist auf exakt ein Event, nicht Event auf eine Liste von Participance,
so ist es ja auch in der DB abgebildet,
beim Anlegen von Participance nimmt dieses alle Informationen auf, Event muss nicht neu gespeichert werden
(selbst wenn nur pseudomäßig, die Information aus der Liste dort sowieso im Participance-Fremdschlüssel landet)

obwohl beides, auch gleichzeitig, möglich ist, Hibernate kann da auch viel tricksen so dass die Gegenrichtung automatisch befüllt wird usw.,

welche der beiden nötig ist oder ob beide zusammen, das kann man logischerweise nicht generell sagen,
auch deine Anwendung im Speziellen mag ich nicht beurteilen, dass musst du selber wissen,

wenn du einen funktionierenden Weg gefunden hast, dann sei doch soweit zufrieden, es muss nicht gleich optimal werden,
sobald ein anderer Weg begründet besser erscheint, kann man doch umstellen
 
Zuletzt bearbeitet von einem Moderator:

Generic1

Top Contributor
mir gefällt die einfache Richtung im Allgemeinen besser: Participance verweist auf exakt ein Event, nicht Event auf eine Liste von Participance,
so ist es ja auch in der DB abgebildet,

- gefällt mir jetzt auch besser, werds umändern und dann mal schaun obs geht, ich hab ein altes/anderes DB- Schema gehabt und bin jetzt gerade am Refactoring, deshalb so viele Fragen.
Vielen Dank noch mal!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Join Abfrage Datenbankprogrammierung 12
S MySQL: Abfrage auf 2 Tabellen durch join Datenbankprogrammierung 5
D JOIN COLUMN wird nicht genommen Datenbankprogrammierung 2
Zrebna Wie mittels Hibernate eine Join-Tabelle als eigene Java-Klasse erstellen? Datenbankprogrammierung 5
D Left Join mit Wioth Rollup Datenbankprogrammierung 0
S MySQL ehemaliger FULL OUTER JOIN zusammenstellen Datenbankprogrammierung 1
L Join zweier Tabellen in SQL Datenbankprogrammierung 2
A Fehlermeldung: JOIN FETCH expressions cannot be defined with an identification variable Datenbankprogrammierung 0
B Inner Join ohne SQL Syntax Datenbankprogrammierung 2
S SQL join - NullPointerExeption Datenbankprogrammierung 3
E Mehrere Tabellenspalten mit INNER JOIN verknüpfen Datenbankprogrammierung 1
OnDemand LEFT JOIN id hat Null Datenbankprogrammierung 6
ruutaiokwu reihenfolge der operanden bei join's Datenbankprogrammierung 5
G SQLite Self Join "unbestimmter tiefe" Datenbankprogrammierung 7
I MySQL Vergleich über mehrere Tabellen! Join? Datenbankprogrammierung 6
N Select mit join Datenbankprogrammierung 3
F Oracle select sum() join select sum() Datenbankprogrammierung 9
Kenan89 Datenbank Join Datenbankprogrammierung 16
M JPQL - Join Verkettung Datenbankprogrammierung 8
K SQL Inner Join - On Klausel Datenbankprogrammierung 10
F Komplexer Tabellen-Join und Ausgabe in Excel Datenbankprogrammierung 17
kirchrath Hibernate Join - angejointes Objekt wählen Datenbankprogrammierung 2
Eldorado MySQL SELECT mit GROUP BY und INNER JOIN Datenbankprogrammierung 2
S SQL inner join bei >10 Tabellen über 2 Variablen Datenbankprogrammierung 2
T MySQL: Join auf sich selbst schlägt fehlt Datenbankprogrammierung 3
MQue Join n:m Datenbankprogrammierung 9
0x7F800000 MS-SQL Server 2008 Wie benutzt man da NATURAL JOIN / INNER JOIN USING? Datenbankprogrammierung 3
D join updaten in java Datenbankprogrammierung 4
G [Hibernate] Problem mit LEFT JOIN Datenbankprogrammierung 7
S Preparestatement mit join Datenbankprogrammierung 4
P Join Datenbankprogrammierung 4
G Hilfe: Werte sind alle x2 (oder mehr) nach JOIN Datenbankprogrammierung 13
M Proble mit Selcet mit join und rst.next() Datenbankprogrammierung 15
T Diverse JDBC Probleme (inner join, rs.last(), update) Datenbankprogrammierung 2
E ERROR: argument of JOIN/ON must be type boolean? Datenbankprogrammierung 2
E Nochmal eine Datenbankabfrage Frage :-o (JOIN oder so) Datenbankprogrammierung 4
E JOIN und * Datenbankprogrammierung 3
G Probleme mit Access und Join Datenbankprogrammierung 3
G PL/SQL: Join mit Collection Datenbankprogrammierung 5
T [SQL] Doppelter Join aus der selben Tabelle & Feldnnamen Datenbankprogrammierung 3
S JOIN und wohin damit? Datenbankprogrammierung 5
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
L PostgreSQL Abfrage mit EclipseLink Datenbankprogrammierung 7
S Berechnung des Datumsunterschieds in der SQL-Abfrage Datenbankprogrammierung 1
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
nonickatall MySQL SQL Abfrage erneut ausführen oder rs aktualisieren Datenbankprogrammierung 14
Kirby.exe Verständnisproblem bei SQL Abfrage Datenbankprogrammierung 27
N SQL-Abfrage in JTextField ausgeben Datenbankprogrammierung 6
N java sql abfrage bestimmer Datumszeitraum Datenbankprogrammierung 9
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Bluedaishi Datenbank Abfrage Datenbankprogrammierung 36
W MySQL DB Abfrage in Array, gemischte Array, generelles vorgehen Datenbankprogrammierung 4
D SQL Abfrage optimieren Datenbankprogrammierung 35
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
D Regelmäßige Abfrage aus Workbench Datenbankprogrammierung 6
M SQL-Statement Hilfe bei SQL-Abfrage Datenbankprogrammierung 2
D Abfrage - Spalte(Datum) ändern (Oracle) Datenbankprogrammierung 7
D Datenbank Abfrage Datenbankprogrammierung 7
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
M MySQL Anbindung und Abfrage an die Datenbank Datenbankprogrammierung 2
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
E Abfrage auf HSQLDB Datenbankprogrammierung 4
M MySQL SQL Abfrage in JTable mit Berechnung Datenbankprogrammierung 3
S Abfrage von Gruppentickets(Mehrere Resorts an einem Tag) Datenbankprogrammierung 1
S SQL Abfrage Datenbankprogrammierung 2
F Abfrage der letzten Einträge Datenbankprogrammierung 2
J SELECT Abfrage/Suche Datenbankprogrammierung 4
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
OnDemand SQL Abfrage und Equals Datenbankprogrammierung 4
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
M MySQL MySQLSyntaxError in Java, obwohl Abfrage in HeidiSQL korrekt Datenbankprogrammierung 2
ruutaiokwu sql abfrage mit rekursion, mit oder ohne cte... Datenbankprogrammierung 5
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
L SQL-Abfrage bricht vor dem Ende ab Datenbankprogrammierung 2
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Derby/JavaDB Komplexe Abfrage vereinfachen Datenbankprogrammierung 2
S SQL-Abfrage, Filewriter .txt Datei Datenbankprogrammierung 2
P Datenbank- Abfrage mit null'en Datenbankprogrammierung 2
Bluedaishi MySQL Abfrage Problem :-) Datenbankprogrammierung 21
D MySQL Erstellen der richtigen Abfrage Datenbankprogrammierung 3
D MySQL DB Abfrage Prüfen Datenbankprogrammierung 10
D JDBC insert mit select abfrage Datenbankprogrammierung 5
E PostgreSQL Exception too ...many clients already bei DB-Abfrage Datenbankprogrammierung 14
M MySQL SQL Abfrage Problem Datenbankprogrammierung 6
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
H JSON Array abfrage beschleunigen Datenbankprogrammierung 2
S MySQL Abfrage: Wenn Feld leer, alles anzeigen Datenbankprogrammierung 5
Mrtwomoon Abfrage-Ergebnisse in einem Fenster darstellen Datenbankprogrammierung 8
0 SQL Abfrage Bestellung Datenbankprogrammierung 15

Ähnliche Java Themen

Neue Themen


Oben