Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] join(?) über 3 Tabellen

Einklappen

Unconfigured Ad Widget

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

  • kn0wledge
    hat ein Thema erstellt [Erledigt] join(?) über 3 Tabellen.

    [Erledigt] join(?) über 3 Tabellen

    Hallo,

    Ich habe 3 Tabellen

    Tabelle message
    ID Date Content

    Tabelle link_information
    ID message_id url ....

    Tabelle video_information
    ID message_id url ....


    PHP-Code:
    'SELECT 
            message.id,
            message.date,
            message.content,
            link_information.url,
            link_information.display_name,
            video_information.url url,
            video_information.name,
            video_information.extension      
            FROM        
            message
              
            LEFT JOIN
            video_information
            ON 
            message.id = video_information.message_id     
            
            LEFT JOIN
            link_information
            ON 
            message.id = link_information.message_id  
            
         
                                         
            ORDER by message.date DESC' 

    So nun zu dem Problem, es kann ja jetz sein, das eine Message z.Bsp. 10 Links und 5 Videos.

    Nun hätte ich gerne einen Array der so aufgebaut ist

    PHP-Code:
    Array
    (
        [
    0] => Array
            (
                [
    ID] => 26
                
    [Date] => 2010-03-17 20:20:05
                
    [Content] => Hallowie gehts so?
                [
    VideoInfo] => Array[0] (
                                                    [
    ID] => 20
                                                    
    [url] => 'http://youtube.com/whatever'
                                                
    )
                                    Array[
    1](
                                                    [
    ID] => 20
                                                    
    [url] => 'http://youtube.com/wha3teve2r'
                                               
    )

               [
    LinkInfo] => Array[0] (
                                                    [
    ID] => 20
                                                    
    [url] => 'http://google.com/whatever'
                                                
    )
                                    Array[
    1](
                                                    [
    ID] => 20
                                                    
    [url] => 'http://heise.de/whatever'
                                               
    )

                                    Array[
    2](
                                                    [
    ID] => 20
                                                    
    [url] => 'http://forum.de/whatever'
                                               
    )  
            )

    Habs so probiert aber dann wurde mir schnell klar das das nicht funktionieren kann.

    PHP-Code:
    ...........
    while(
    $stmt->fetch()) {

        
    $video_info[] = array('ID' => $messageID,
                            
    'VideoUrl' => $video_url
                            
    );

        
    $link_info[] = array('ID' => $messageID,
                                      
    'LinkUrl' => $link_url);
        
        
    $Result[] = array('ID' => $messageID,
                          
    'Date' => $date,
                          
    'Content' => $content,
                              
    'VideoInfo' => $video_info,
                              
    'LinkInfo' => $link_url                  
                                         
                          
    );
        

    }
    ................ 
    Das heißt wie kann ich das realisieren, es muss für jede message ID die entsprechenden Einträge in den anderen beiden Tabellen liefern die mit dieser message ID verknüpft sind, Problem ist auch das es auch möglich ist das weder links noch videos zur message vorhanden sind.


    Edit:// Ach fuck falsche Kategorie kann mal jemand verschieben bitte ^^.

  • kn0wledge
    antwortet
    So habs, wenns jemand wirklichen brauchen sollte hier die Lösung(dabei ist array_empty eine selbstgeschriebene Funktion die Prüft ob der Array leer ist oder Werte enthält).

    Ein bisschn Sorgen macht mir die Performance weil ich in den meisten Fällen 4 Schleifen durchlaufen lasse, aber naja hier

    PHP-Code:
    $sql 'SELECT
            message.id,
            message.date,
            message.content
            FROM
            message
            ORDER BY date DESC
            LIMIT 0, 20'
    ;

    $stmt $db->prepare($sql);
    if(!
    $stmt->execute()) {
    return 
    $db->error;
    }
    $stmt->bind_result($messageID$date$text);

    while(
    $stmt->fetch()) {
        
        
    $MessageIDs[] = $messageID;
        
    $ContentArray[$messageID] = array('Date' => $date,
                                          
    'Text' => $text);
        
    }
    $MessageIDs implode(','$MessageIDs);

    $stmt->close();

    $sql 'SELECT
            message_id, 
            url,
            host
            FROM
            link_information
            WHERE message_id IN('
    .$MessageIDs.')';
    $stmt $db->prepare($sql);
    $stmt->execute();
    $stmt->bind_result($link_m_id$link_url$link_host);

    while(
    $stmt->fetch()){
            
        
    $link_info[] = array('MessageID' => $link_m_id,
                             
    'LinkUrl' => $link_url,
                             
    'LinkHost' => $link_host);
        
    }
    $stmt->close();

    $sql 'SELECT
            message_id, 
            url,
            xcy
            FROM
            video_information
            WHERE message_id IN('
    .$MessageIDs.')';
    $stmt $db->prepare($sql);
    $stmt->execute();
    $stmt->bind_result($video_m_id$video_url$xyc);

    while(
    $stmt->fetch()){
            
        
    $video_info[] = array('MessageID' => $video_m_id,
                             
    'videoUrl' => $video_url,
                             
    'xyc' => $xyc);
        
    }
    $stmt->close();
    $db->close();

    // video_Info Array mit Content Array verknüpfen
    if(!array_empty($video_info)){

    $lenContent count($ContentArray);
    $lenVideo count($video_info);

    if(
    $lenContent $lenVideo) {
        foreach(
    $ContentArray as $key => $content) {
            foreach(
    $video_info as $pinfo) {
               if(
    $key == $pinfo['MessageID']) {
                   
                   
    $ContentArray[$key]['videoInfo'][] = $vinfo;
                   
               }        
                
            }        
        }    
    }
    //-------------------------------------------------------
    if($lenContent $lenVideo) {
        foreach(
    $video_info as $key => $pinfo) {
            foreach(
    $ContentArray as $mID => $cont) {
               if(
    $pinfo['MessageID'] == $mID) {
                   
                   
    $ContentArray[$key]['videoInfo'][] = $pinfo;
                   
               }        
                
            }        
        }    
        
    }


    // Ende Verknüpfung video_Array mit Content_Array


    // Link_Info Array mit Content Array verknüpfen
    if(!array_empty($link_info)){


    $lenContent count($ContentArray);
    $lenLink count($link_info);

    if(
    $lenContent $lenLink) {
        foreach(
    $ContentArray as $key => $content) {
            foreach(
    $link_info as $linfo) {
               if(
    $key == $linfo['MessageID']) {
                   
                   
    $ContentArray[$key]['LinkInfo'][] = $linfo;
                   
               }        
                
            }        
        }    
    }
    //-------------------------------------------------------
    if($lenContent $lenLink) {
        foreach(
    $link_info as $key => $linfo) {
            foreach(
    $ContentArray as $mID => $cont) {
               if(
    $linfo['MessageID'] == $mID) {
                                  
                   
    $ContentArray[$mID]['LinkInfo'][] = $linfo;
               
                   
               }        
                
            }        
        }    
        
    }


    // Ende Verknüpfung Link_Array mit Content_Array 

    Einen Kommentar schreiben:


  • kn0wledge
    antwortet
    Zitat von mepeisen Beitrag anzeigen
    Kannst du endlich mal aufhören, darauf rumzureiten und endlich ins MySQL-Handbuch oder in deinem Lieblings-Tutorial schauen, ob der Operator IN dort erklärt wird? Ich werde dir in Zukunft nicht mehr weiterhelfen, wenn du nicht endlich dazulernst, dass du zumindest von mir keine Vorlagen für Copy&Paste kriegst. Eigeninitiative in Form von Recherche vorgegebener Stichwörter, musst du zeigen. Ansonsten wird das mit dem Programmieren nichts mehr.
    Ich hab schon nachgeschaut, sofort wo ich deinen Beitrag gesehen hab, wo liest du jetz bitte wieder raus das ich ein fertiges Script von dir will xD

    Sobald ich daheim bin werd ich es umsetzten.
    Und wenn ich es dann geschafft hab diesen Thread als erledigt markieren.

    Einen Kommentar schreiben:


  • mepeisen
    antwortet
    Kannst du endlich mal aufhören, darauf rumzureiten und endlich ins MySQL-Handbuch oder in deinem Lieblings-Tutorial schauen, ob der Operator IN dort erklärt wird? Ich werde dir in Zukunft nicht mehr weiterhelfen, wenn du nicht endlich dazulernst, dass du zumindest von mir keine Vorlagen für Copy&Paste kriegst. Eigeninitiative in Form von Recherche vorgegebener Stichwörter, musst du zeigen. Ansonsten wird das mit dem Programmieren nichts mehr.

    Einen Kommentar schreiben:


  • kn0wledge
    antwortet
    Zitat von mepeisen Beitrag anzeigen
    Lerne bitte im MySQL-Tutorial deines Vertrauens die Verwendung des Operators "IN".

    Zum anderen: Ich merke, wenn sich jemand beratungsresistent gibt. Nur irgendwann wirst du wie gesagt mit dieser Einstellung nicht glücklich werden. Ich bin nicht der einzige, der sich lieber einem anderen Thema widmet als einem Autor wiederholt 08/15 Fragen aus der Nase zu ziehen. Ein Beispiel sollte durchgängig logisch sein und sich nicht selbst widersprechen.
    mehr sage ich dazu nicht mehr. Zum Thema hier auch nicht mehr. Auf Rätselraten habe ich nämlich genausowenig Bock.

    Ich finde das irgendwie paradox auf der einen Seite gibts du 2 hilfreiche antworten und versuchst mir einen Lösungsweg zu zeigen, auf der anderen Seite schreibst du was von Rätselraten, jedoch weißt du genau was ich will und um was es geht.

    Rein logisch betrachtet wiedersprechen sich die Beispiele in keinen einzigen Fall.

    Ja ok vllt. wär der Syntax so richtiger, hat aber mit der Logik der Beispiele an sich 0 zu tun.
    PHP-Code:
      [VideoInfo] => [0]=>Array (
                                                    [
    ID] => 20
                                                    
    [url] => 'http://youtube.com/whatever'
                                            
    )
                           [
    1]=> Array(
                                                    [
    ID] => 20
                                                    
    [url] => 'http://youtube.com/wha3teve2r'
                                            

    ich bin definitv nicht Beratungsresistent, doch bisher hat niemand eine konstruktive Kritik angebracht wo genau bei meinen Formulierungen etwas unlogisch, falsch whatever sein soll.

    Das einzige was kommt ist in etwa "du bist so, dein Beitrag ist scheiße, also halt deine Fresse".

    Einen Kommentar schreiben:


  • mepeisen
    antwortet
    Lerne bitte im MySQL-Tutorial deines Vertrauens die Verwendung des Operators "IN".

    Zum anderen: Ich merke, wenn sich jemand beratungsresistent gibt. Nur irgendwann wirst du wie gesagt mit dieser Einstellung nicht glücklich werden. Ich bin nicht der einzige, der sich lieber einem anderen Thema widmet als einem Autor wiederholt 08/15 Fragen aus der Nase zu ziehen. Ein Beispiel sollte durchgängig logisch sein und sich nicht selbst widersprechen.
    mehr sage ich dazu nicht mehr. Zum Thema hier auch nicht mehr. Auf Rätselraten habe ich nämlich genausowenig Bock.

    Einen Kommentar schreiben:


  • kn0wledge
    antwortet
    Zitat von mepeisen Beitrag anzeigen
    Zu erwarten, wir w+rden hier sowas leisten, ist ziemlich vermessen bzw. zeigt, dass du die Zielsetzung des Forums nicht verstanden hast.


    Es ist ganz einfach: Formuliere deine Fragestellung vernünftig, dann wird dir geholfen. Formuliere sie nicht vernünftig und reagiere patzig auf Rückfragen, dann wirst du in diesem Forum keine Freude haben.

    Es kostet dich vielleicht 5 Minuten deines Lebens, die Fragestellung nicht runterzuschmieren sondern vernünftig zu stellen. Uns kostet es unter Umständen Stunden, dir was aus der Nase zu ziehen oder was reinzuinterpretieren und hinterher verärgert festzustellen, dass du doch was ganz anderes gemeint hast.
    Ich hab keine Erwartungen an niemanden außer mir selber hier.

    Ich habe das Ganze auch nicht so formuliert nach dem Motto macht mal, ich hab versucht das ganze mit Beispielen zu erklären und habe das -meiner Meinung- so getan das man versteht um was es geht, und hab dazu auch noch meinen bisherigen Ansatz eingebracht.

    In meinem ersten Post steht
    ... für jede message ID die entsprechenden Einträge in den anderen beiden Tabellen liefern die mit dieser message ID verknüpft sind...
    wie diese miteinander verknüpft sind hab ich sogar noch farblich hervorgehoben.

    darf ich fragen was daran unklar ist und wo hier das Problem an meiner Formulierung ist?

    Aber egal, wenn dann so eine unfreundliche Antwort kommt wie die von (von wem auch sonst) nikosch, dann Antwort ich halt so.

    Ich erwarte hier von niemandem dass er mir antwortet ich wünsche es mir lediglich um bei meinem Projekt weiter zu kommen.

    Zum Thema zurück:

    1. Möglichkeit:
    Code:
    SELECT ... FROM Tabelle WHERE Message_ID = 3
    2. Möglichkeit:
    Code:
    SELECT ... FROM Message LEFT OUTER JOIN Link ON Message.ID=Link.Message_ID
    Ich empfehle dir jedoch, drei separate Selects abzusetzen. Select #1 fragt die Messages ab und speichert sie in einem Array (Message-ID als Key).
    Select #2 fragt die Videos ab und steckt sie bei der zugehörigen Message hinzu. Da die Messages per ID angesprochen werden können, ist das kein Problem mehr.
    Select #3 macht selbiges für die Links.
    Nett das du dich damit beschäftigst und helfen willst, das weiß ich aufjedenfall zu schätzen.

    Kann es gerade leider nicht testen, aber wäre
    PHP-Code:
    $last_key key (end ($Message)); 
    // mit key von dem Array Message as ID der Tabelle message.
    'SELECT xy FROM
    Link
    WHERE 
    message_id ='
    .$Message[16].'
    OR
    message_id ='
    .$Message[17].
    OR
    message_id ='
    .$Message[18].'
    ..........
    OR 
    message_id ='
    .$Message[$last_key]; 
    Vom Ansatz her dann richtig?

    Einen Kommentar schreiben:


  • mepeisen
    antwortet
    Wenn du jemandem eine Frage stellst, der weder weiß, was du weißt noch jemals etwas von deinem Projekt, deiner Idee und deinem Kenntnisstand etwas weiß, musst du IMMER die Fragen und Problembeschreibungen so formulieren, dass man sich nichts selbst denken muss. Wenn du einen professionellen Coach wünscht, der an deiner Seite ist und dich an die Hand nimmt, dann bezahle ihn. Zu erwarten, wir w+rden hier sowas leisten, ist ziemlich vermessen bzw. zeigt, dass du die Zielsetzung des Forums nicht verstanden hast.

    Es ist ganz einfach: Formuliere deine Fragestellung vernünftig, dann wird dir geholfen. Formuliere sie nicht vernünftig und reagiere patzig auf Rückfragen, dann wirst du in diesem Forum keine Freude haben.

    Es kostet dich vielleicht 5 Minuten deines Lebens, die Fragestellung nicht runterzuschmieren sondern vernünftig zu stellen. Uns kostet es unter Umständen Stunden, dir was aus der Nase zu ziehen oder was reinzuinterpretieren und hinterher verärgert festzustellen, dass du doch was ganz anderes gemeint hast.


    Zum Thema zurück:
    Also Nochmal wie ist es möglich per Select, alle Daten aus den anderen beiden Tabellen zu der jeweiligen ID der ersten Tabelle zu bekommen ?
    1. Möglichkeit:
    Code:
    SELECT ... FROM Tabelle WHERE Message_ID = 3
    2. Möglichkeit:
    Code:
    SELECT ... FROM Message LEFT OUTER JOIN Link ON Message.ID=Link.Message_ID
    Ich empfehle dir jedoch, drei separate Selects abzusetzen. Select #1 fragt die Messages ab und speichert sie in einem Array (Message-ID als Key).
    Select #2 fragt die Videos ab und steckt sie bei der zugehörigen Message hinzu. Da die Messages per ID angesprochen werden können, ist das kein Problem mehr.
    Select #3 macht selbiges für die Links.

    Einen Kommentar schreiben:


  • kn0wledge
    antwortet
    Naja es geht um die Datenbankabfrage, könnte man siche ja auch aus dem Titel denken...naja mach dir nichts drauß :O

    Code:
    Tabelle Message 
    ID-----Content
    1        Das ist ein Text... 
    2       Auch ein Text 
    3          Nachricht nr 32423
    Code:
    Tabelle Link 
    ID---Message_ID---------------------Url
    1     3                  hxx:// www.heise.de
    2     3                   hxx://www.google.de
    3     3                 hxx://www.scheße.de
    4     4                 hxx://www.facebook.de
    5     5                   hxx://www.bing.de
    6     5                  hxx://www.asdasd.de
    7     6                 hxx://www.h234234.de
    Code:
    Tabelle Video
    ID---Message_ID--------------------------------url_video
    1     2                  http://www.youtube.com/watch?v=jBU93V2x44E
    2     2                   http://www.youtube.com/watch?v=jBU93V2x44E  
    3     3                   http://www.youtube.com/watch?v=jBU93V2x44E
    4     3                  http://www.youtube.com/watch?v=jBU93V2x44E
    5     3                   http://www.youtube.com/watch?v=jBU93V2x44E
    6     4                  http://www.youtube.com/watch?v=jBU93V2x44E
    7     6                   http://www.youtube.com/watch?v=jBU93V2x44E
    Also Nochmal wie ist es möglich per Select, alle Daten aus den anderen beiden Tabellen zu der jeweiligen ID der ersten Tabelle zu bekommen ?

    ALS BEISPIEL erste Tabelle mit ID 3 nun will ich alle Zeilen der anderen Tabelle auslesen die ebenfalls diese in diesem Beispiel orange gefärbte message_id 3 haben.

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Ja, nee is klar Plato.

    Lass mich noch kurz Deine Fehler korrigieren.

    [MOD: verschoben]

    Einen Kommentar schreiben:


  • kn0wledge
    antwortet
    Zitat von nikosch Beitrag anzeigen
    Vergiss es. Du bist auch so ein Ignorant, der es nie verstehen wird, was es heißt, einen ordentlichen Forumsbeitrag zu verfassen. Btw. Dein Traum-Array ist auch syntaktischer Blödsinn. Ach warte - ich weiss - man kann sich ja schliesslich denken, was gemeint ist..
    Man muss nichts denken, man sollte nur lesen können.
    Du bist so Ignorant du wirst niemals vernünftig auf einen Beitrag antworten können, der Thread ist außerdem in der falschen Kategorie steht sogar unten eine Bitte drann ihn zu verschieben, aber allein das du das nicht bemerkt hast zeigt mir schon das du nichtmal einen Beitrag zu Ende liest bevor du deinen geistigen Müll von dir gibst

    Entweder willst du nichts verstehen oder du bist halt tatsächlich so dermaßen 1 Dimensional :/

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Vergiss es. Du bist auch so ein Ignorant, der es nie verstehen wird, was es heißt, einen ordentlichen Forumsbeitrag zu verfassen. Btw. Dein Traum-Array ist auch syntaktischer Blödsinn. Ach warte - ich weiss - man kann sich ja schliesslich denken, was gemeint ist..

    Einen Kommentar schreiben:


  • kn0wledge
    antwortet
    Zitat von nikosch Beitrag anzeigen
    Keine Ahnung, was einem Dein Beispiel sagen soll. Oben redest Du von "10 Links und 5 Videos" Unten sehe ich 5 Links, die auch die Arrayschlüssel „VideoInfo“ und „LinkInfo“ verteilt sind. Nach welchen Kriterien weisst nur Du.
    Hab echt keinen Bock mehr auf Ratespiele in diesem Forum.
    Etwas Textverständnis und das ist kein Ratespiel.

    So nun zu dem Problem, es kann ja jetz sein, das eine Message z.Bsp. 10 Links und 5 Videos.
    Da steht ZBSP. zum Beispiel !! ich könnte auch schreiben jeder Message sind X Links und Y Videos zugeordnet mit X € N und Y € N
    hier steht nirgends was von einer absoluten Anzahl und unten der Array ist auch nur ein Beispiel, zu der Ausgabe die ich haben will.
    Die ich aber NICHT bekomme, das ist ja die Frage, wie ich das so hinbekomme.

    Das heißt "LinkInfo" und "VideoInfo" können auch LEER sein.

    Was verstehst du daran nicht?

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Keine Ahnung, was einem Dein Beispiel sagen soll. Oben redest Du von "10 Links und 5 Videos" Unten sehe ich 5 Links, die auch die Arrayschlüssel „VideoInfo“ und „LinkInfo“ verteilt sind. Nach welchen Kriterien weisst nur Du.
    Hab echt keinen Bock mehr auf Ratespiele in diesem Forum.

    Einen Kommentar schreiben:

Lädt...
X