tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
210
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    daft075 daft075 ist offline Rookie
    Registriert seit
    Oct 2010
    Beiträge
    7
    Hi Leute,

    Ich kenne diese Seite schon ziemlich lange, und habe sehr oft sachen gefunden die mir weiter geholfen haben.
    Danke !
    Aber diesmal habe ich ein (für mich) echt kompliziertes Problem.

    Eigentlich bin ich ein freestyler was PHP codes angeht.
    Hab alles irgendwie aus dem Internet gelehrnt. Damit will ich nur sagen das ich kein super Coder bin oder so.

    Nun zum Problem.

    Ich habe mehrere Tabellen die ich mit einer abfrage über JOIN anspreche. Und es funktioniert alles wunderbar.
    Aber in der JOIN abfrage habe ich auch eine Tabelle die mehrere (4) fremdschlüsseln einer anderen Tabelle enhält.
    Jetzt habe ich mir überlegt, entweder lasse ich es so wie es ist, kann aber nur mit einem fremdschlüssel arbeiten, oder ich mach eine Kreuztabelle.
    Gedacht getan.
    Am Ergebnis hat sich aber nichts geändert. Bekomme auch nur ein statt 4 einträge.

    Jetzt zu meiner Frage.

    Wenn ich ohne Kreuztabelle arbeite, wie spreche ich die anderen fremdschlüsseln an ****?
    Und wenn ich mit Kt arbeite, ... eigentlich stelt sich die gleiche Frage. Wie spreche ich diese an ****?

    PHP-Code:
    $abfrage_produktion mysql_query("SELECT * FROM $tb_beitrag 
                                    LEFT JOIN 
    $tb_prod_beitrag_kt 
                                    ON 
    $tb_beitrag.beitrag_id = $tb_prod_beitrag_kt.beitrag_f_id
                                    LEFT JOIN 
    $tb_dreh_beitr_kt 
                                    ON 
    $tb_beitrag.beitrag_id = $tb_dreh_beitr_kt.beitrag_f_id
                                    LEFT JOIN 
    $tb_beitr_schnitt_kt 
                                    ON 
    $tb_beitrag.beitrag_id = $tb_beitr_schnitt_kt.beitrag_f_id
                                    LEFT JOIN 
    $tb_schnitt 
                                    ON 
    $tb_beitr_schnitt_kt.schnitt_f_id = $tb_schnitt.schnitt_id
                                    LEFT JOIN 
    $tb_schnittplatz 
                                    ON 
    $tb_schnitt.schnittplatz_f_id = $tb_schnittplatz.sp_id
                                    LEFT JOIN 
    $tb_dreh 
                                    ON 
    $tb_dreh_beitr_kt.dreh_f_id = $tb_dreh.dreh_id
                                    LEFT JOIN 
    $tb_kfz 
                                    ON 
    $tb_dreh.kfz_f_id = $tb_kfz.kfz_id
                                    LEFT JOIN 
    $tb_produktion 
                                    ON 
    $tb_produktion.produktion_id = $tb_prod_beitrag_kt.produktion_f_id
                                    LEFT JOIN 
    $tb_personal 
                                    ON 
    $tb_produktion.personal_kamera_f_id = $tb_personal.personal_id
                                    LEFT JOIN 
    $tb_pers_funkt_kt 
                                    ON 
    $tb_personal.personal_id = $tb_pers_funkt_kt.personal_f_id
                                    LEFT JOIN 
    $tb_funktion 
                                    ON 
    $tb_pers_funkt_kt.funktion_f_id = $tb_funktion.funktion_id"); 
    das wäre die Abfrage ohne KT
    Wobei, mir fehlen noch andere FS, die ich nicht eingetragen habe weil sonst die Abfrage nicht funktionieren würde.
    Die Betreffenden tabellen wären $tb_dreh und $tb_personal.

    PHP-Code:
    $abfrage_produktion mysql_query("SELECT * FROM $tb_dreh 
                              LEFT JOIN 
    $tb_dreh_schnitt_kt 
                              ON 
    $tb_dreh.dreh_id = $tb_dreh_schnitt_kt.dreh_f_id
                              LEFT JOIN 
    $tb_personal_dreh_kt
                              ON 
    $tb_personal_dreh_kt.pd_dreh_f_id = $tb_dreh.dreh_id
                              LEFT JOIN 
    $tb_personal
                              ON 
    $tb_personal.personal_id = $tb_personal_dreh_kt.pd_personal_f_id
                              LEFT JOIN 
    $tb_kfz 
                              ON 
    $tb_dreh.kfz_f_id = $tb_kfz.kfz_id
                              LEFT JOIN 
    $tb_schnitt 
                              ON 
    $tb_dreh_schnitt_kt.schnitt_f_id = $tb_schnitt.schnitt_id
                              LEFT JOIN 
    $tb_schnittplatz
                              ON 
    $tb_schnitt.schnittplatz_f_id = $tb_schnittplatz.sp_id
                              LEFT JOIN 
    $tb_beitr_schnitt_kt 
                              ON 
    $tb_schnitt.schnitt_id = $tb_beitr_schnitt_kt.schnitt_f_id
                              LEFT JOIN 
    $tb_beitrag
                              ON 
    $tb_beitr_schnitt_kt.beitrag_f_id = $tb_beitrag.beitrag_id 
                              LEFT JOIN 
    $tb_event
                              ON 
    $tb_event.event_id = $tb_dreh.event_f_id"); 

    Das wäre der Code mit KT.
    Hier Betreffenden Tabelen sind $tb_dreh, $tb_personal, und $tb_personal_dreh_kt

    Bin für jede Hilfe dankbar.
     

  2. #2
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Hast du mal ein Duagram dass die Zusammenhänge aufzeigt? Dann versteh ich ev. den mit abkürzungen überfüllten Text und auch was du unter Kreuztabelle verstehst.

    Schreib auch welche Tabelle die mit den 4 Schlüsseln ist und zu welchen Tabellen diese dann gehören.

    PS: Aliase auf die Tabellennamen verhindern zuviele PHP-Variablen innerhalb des SQLs
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    SELECT 
        * 
    FROM 
        {$tb_dreh} AS d
        LEFT JOIN {$tb_dreh_schnitt_kt} AS dskt
            ON d.dreh_id = dskt.dreh_f_id
        LEFT JOIN {$tb_personal_dreh_kt} AS pdkt
            ON pdkt.pd_dreh_f_id = d.dreh_id
        LEFT JOIN {$tb_personal} AS p
            ON p.personal_id = pdkt.pd_personal_f_id
        LEFT JOIN {$tb_kfz} AS kfz
            ON d.kfz_f_id = kfz.kfz_id
        LEFT JOIN {$tb_schnitt} AS s
            ON dskt.schnitt_f_id = s.schnitt_id
        LEFT JOIN {$tb_schnittplatz} AS sp
            ON s.schnittplatz_f_id = sp.sp_id
        LEFT JOIN {$tb_beitr_schnitt_kt}  AS bskt
            ON s.schnitt_id = bskt.schnitt_f_id
        LEFT JOIN {$tb_beitrag} AS b
            ON bskt.beitrag_f_id = b.beitrag_id 
        LEFT JOIN {$tb_event} AS e
            ON e.event_id = d.event_f_id
    Geändert von Yaslaw (25.10.10 um 12:35 Uhr)
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  3. #3
    daft075 daft075 ist offline Rookie
    Registriert seit
    Oct 2010
    Beiträge
    7
    Diagramm bild habe ich hier

    Das problem ist, ich bin mir einfach nicht sicher wie das zu lösen ist.
    Nicht nur Code seitig, sondern auch Tabellen seitig.
    Vileicht muss ich das noch mehr zerlegen.

    Mit Kreuztabellen meine ich Tabelle die man für eine m:n beziehhung braucht (zwischentabelle oder wie man sie halt nennt).
    Was Aliase angeht, da gebe ich dir volkommen recht. Nur mich verwirren diese irgend wie und deswegen verwende ich sie kaum.

    Und danke für schnelle Antwort

    Eigentlich könnte die Abfrage so lauten
    (ich beschrenke mich jetzt nur auf die Tabellen die mir Probleme machen)

    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    SELECT 
    * 
    FROM
    DREH
    LEFT JOIN personal AS kamera
    ON dreh.kamera_f_id = kamera.personal_id
    LEFT JOIN personal AS redakteur
    ON dreh.redakteur_f_id = redakteur.personal_f_id
    LEFT JOIN personal AS ton
    ON dreh.ton_f_id = ton.personal_f_id
    .
    .
    .

    Dann stellt sich aber die Frage, wie spreche ich bei der auswertung (in der while schleife) diese Aliase an ********?
    Geändert von daft075 (25.10.10 um 13:21 Uhr)
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Ah, jetzt versteh ich. Du hast die Tabelle PERSONAL einmal. Aber du hast in der Tabelle DREH vier Felder die auf PERSONAL zugreiffen.

    Falls das Bild aus der DB erstellt wurde, solltest du die Verknüpfung DREH-PERSONAL ändern. Die Tabelle PERSONAL müsste 4 mal auftauchen und je eine Verbindung haben.

    Das SQL für die Verknüpfungen DREH-PERSONAL würde dann etwa so aussehen
    Code sql:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    SELECT
        dreh.*,
        redakteur.personal_name AS redakteur_name,
        regie.personal_name AS regie_name,
        kamera.personal_name AS kamera_name,
        ton.personal_name AS ton_name   
    FROM
        dreh
        LEFT JOIN personal AS redakteur
            ON dreh.redakteur_f_id = redakteur.personal_id
        LEFT JOIN personal AS regie
            ON dreh.regie_f_id = regie.personal_id
        LEFT JOIN personal AS kamera
            ON dreh.kamera_f_id = kamera.personal_id
        LEFT JOIN personal AS ton
            ON dreh.kamera_f_id = ton.personal_id
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    daft075 daft075 ist offline Rookie
    Registriert seit
    Oct 2010
    Beiträge
    7
    Das habe ich mir gedacht.
    Nur der ursprunglicher gedanke war folgender.
    Ich wollte unbedingt nur eine PERSONAL Tabelle haben, da ich unser Personal verwaltung so pflegen wollte.

    Danke für deine Hilfe.
     

  6. #6
    Avatar von Yaslaw
    Yaslaw Yaslaw ist offline n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    5.205
    Du hast so nur eine Personal-Tabelle. Alle vier Beziehungen greiffen auf dieselbe Tabelle zu - aber nicht gleichzeitig.

    Sind die Beziehungen in der DB definiert oder hast du sie nur in der Grafik so? Im 2ten Fal ist alles bestens.
     
    ---------------------------------------------------------------------------------------------------
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  7. #7
    daft075 daft075 ist offline Rookie
    Registriert seit
    Oct 2010
    Beiträge
    7
    Die Beziehungen sind in der DB nicht definiert. Ich dacht das macht man eben mit der JOIN anweisung.
    Die Grafik habe ich mit Navicat test version gemacht.
    War auch für mich einfacher zu verstehen und kontrolieren.
     

Ähnliche Themen

  1. JOIN auf eine Tabelle und Abfrage des letzten gefüllten Wertes
    Von AlexD1979 im Forum Relationale Datenbanksysteme
    Antworten: 9
    Letzter Beitrag: 19.05.10, 10:50
  2. Antworten: 3
    Letzter Beitrag: 28.09.09, 15:59
  3. Tabellen mit mehreren Fremdschlüsseln O/R Mapping mit EJB 3.0 Annotierung
    Von Kaylem im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 3
    Letzter Beitrag: 29.09.08, 13:21
  4. Inner Join mit mehreren SQL-Server Datenbanken
    Von Moe1980 im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 06.05.08, 13:58
  5. Join mit mehreren Tabellen
    Von akkie im Forum Relationale Datenbanksysteme
    Antworten: 3
    Letzter Beitrag: 17.08.03, 12:14

Stichworte