Ankündigung

Einklappen
Keine Ankündigung bisher.

MySQL: Tabelle auslesen und Zusatzinformationen aus zweiter Tabelle holen

Einklappen

Neue Werbung 2019

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

  • MySQL: Tabelle auslesen und Zusatzinformationen aus zweiter Tabelle holen

    Hallo zusammen,

    ich arbeite im Moment weiter mit Joomla und habe ein Model, welches mir Daten beschafft. Dieses Model liest einen Datensatz aus, beispielsweise eine Anzahl von X Emails.

    Die Emails werden in meiner Tabelle "mails" gespeichert. Jede Emailkorrespondenz soll jedoch mehrere einzelne Mails enthalten. Diese einzelnen Mails sind in der Tabelle "mails_messages" gespeichert.

    Angenommen eine Korrespondenz besteht aus 3 Emails: Wie kann ich die Korrespondenz mit den Inhalten zusammen auslesen?

    Ziel der Übung ist beispielsweise, dass ich auf der Übersichtsseite sehe: Es gibt 3 Emails mit jeweils X einzelnen Nachrichten.

    Mein aktueller Ansatz:

    PHP-Code:
    $db    $this->getDbo();
    $query  $db->getQuery(true);
    $query->select(
    $this->getState(
                                
    'list.select',
                                
    'a.id, a.title, '.
                                
    'a.state,'.
                                
    'a.publish_up, a.publish_down, a.checked_out, a.checked_out_time, a.ordering'
                                
    ));
          

    $query->from($db->quoteName('#__bestia_mails').' AS a');
            
    // Join over the users for the checked out user.
            
    $query->select('uc.name AS editor')
                    ->
    join('LEFT''#__users AS uc ON uc.id=a.checked_out'); 
    Diese Abfrage gibt mir aktuell zurück: Es gibt eine Korrespondenz. Wie kann ich nun die damit verknüpften Inhalte hinterlegen? Beispielsweise soll angezeigt werden, wie viele Nachrichten zu einer Korrespondenz gehören. Ist das machbar?

  • erc
    antwortet
    Für was auch immer das jetzt die Lösung sein soll.
    Das kommt damit nämlich nicht raus:
    Ich hätte aber gerne ein Ergebnis wie

    - Konversation 1
    -- 5 Mails
    - Konversation 2
    -- 2 Mails
    - Konversation 3
    -- 4 Mails

    Einen Kommentar schreiben:


  • SPQR Inc.
    antwortet
    Hallo erc,

    in Joomla werden die Daten ausgelesen, die den Bedingungen des Filters entsprechen.

    Ich habe mittlerweile folgende Lösung:

    PHP-Code:
    // Join over the content of the mails
    $query->select('GROUP_CONCAT(c.content) AS content')
    ->
    join('LEFT''#__bestia_mails_messages AS c ON c.mailid=a.mailid')
    ->
    group($db->quoteName('a.mailid')); 
    Diese Lösung ist noch nicht optimal, aber es ist ein Anfang

    Einen Kommentar schreiben:


  • erc
    antwortet
    Täuscht das oder haben wir unterschiedliche Vorstellungen vom Begriff auslesen? Filter nach einem Wert != Auslesen eines Wertes...

    Einen Kommentar schreiben:


  • SPQR Inc.
    antwortet
    Hallo erc,

    ich hatte doch geschrieben, dass ich nicht nur die Mail-ID, sondern auch damit verknüpfte Datensätze auslesen möchte.

    In Joomla werden im Model Daten aufbereitet, die dann später z.B. in der View eingefügt werden können. Die Methode GetListQuery gibt hier einen Datensatz zurück, der nach meiner Vorstellung nicht nur den Inhalt der Tabelle, sondern auch den Inhalt der mit der Tabelle verknüpften Tabelle beinhalten sollte.

    Besonders bequem wäre dies, weil die getListQuery-Methode auch eine Suche erlaubt. Nachvollziehen kannst Du das unter http://d.pr/n/e6lw.

    Schön wäre jetzt gewesen, wenn ich in der betreffenden Zeile hätte schreiben können:

    PHP-Code:
    $query->where('(a.id LIKE ' $search ' OR a.title LIKE ' $search ' OR c.content LIKE ' $search ' OR a.mailid LIKE ' $search ')'); 
    c.content hätte dann der Inhalt der verknüpften Mails sein können. Schön wäre dann auch gewesen, wenn es möglich gewesen wäre, die Anzahl der verknüpften Emails gleich zu zählen.

    Einen Kommentar schreiben:


  • erc
    antwortet
    Was hat den jetzt das Durchsuchen des Inhaltes damit zu tun? Das sind unterschiedliche Probleme mit jeweils eigenem Lösungsansätzen.

    Einen Kommentar schreiben:


  • SPQR Inc.
    antwortet
    Hallo erc,

    vielen Dank für Deine Antwort.
    Dies wäre dann eine mögliche Anwendung.

    Wie ich im ersten Beitrag geschrieben habe:

    Wie kann ich die Korrespondenz mit den Inhalten zusammen auslesen?
    Der Inhalt soll also auch auslesbar sein, damit man von der Startseite aus nicht nur nach ID, sondern auch nach Inhalt suchen kann.

    Einen Kommentar schreiben:


  • erc
    antwortet
    Wenn ich mich nicht täusche war vorns noch die Rede von der Anzahl und nicht des Inhaltes.

    Einen Kommentar schreiben:


  • SPQR Inc.
    antwortet
    Hallo zusammen,

    ich habe nun einfach mal in phpMyAdmin folgende Anweisung abgesetzt:

    Code:
    select h.mailid, c.content from `a0c8u_bestia_emails` AS h LEFT JOIN `a0c8u_bestia_emails_messages` as c ON c.mailid = h.mailid GROUP BY h.mailid;
    Es funktioniert insofern, dass der Inhalt der ersten Email als Feld "content" mit ausgegeben wird.

    Siehe: http://d.pr/i/F13A

    Es sind jedoch insgesamt mehrere Einträge vorhanden, die ja alle mit aufgenommen werden müssen, siehe: http://d.pr/i/bxk8

    Einen Kommentar schreiben:


  • erc
    antwortet
    Zitat von SPQR Inc. Beitrag anzeigen
    Ich danke euch für eure Antworten - @erc: JOIN und COUNT sind mir bekannt. Ich bekomme aber die Verknüpfung zu meinem Query einfach gedanklich noch nicht hin.
    Vielleicht solltest du dazu noch bekanntschaft mit GROUP BY schließen. Du hast zwei Tabellen, soviele Möglichkeiten gibts da nicht.

    Einen Kommentar schreiben:


  • SPQR Inc.
    antwortet
    Hallo moma, hallo erc,

    genau: Datenbanktabelle 1 enthält die Konversationen, Datenbanktabelle 2 enthält die Nachrichten, die zu der Konversation gehören. Diese Nachrichten lassen sich eindeutig über die ID der Konversation zuordnen.

    Nun habe ich ein Problem, und genau darum geht es in meiner Frage:

    In meiner Übersicht möchte ich alle Konversationen auflisten. D.h. wenn 5 Mails zu einer Konversation gehören, soll auf der Übersichtsseite nur die eine Konversation erscheinen - meinetwegen mit der Anzahl der Nachrichten in Klammern:

    Beispiel:
    Konversation 1 (5 Mails)

    Nach dem Joomla MVC ist für die Auflistung mehrerer Datensätze die Methode getListQuery "zuständig". Hier wird ein Datenbankobjekt erstellt und ein query abgesetzt. Ich kann also sagen: Liste mir alle Datensätze auf, die in der Tabelle "Konversationen" liegen.

    In meinem Fall sieht diese Methode so aus:

    PHP-Code:
    $db    $this->getDbo(); //Datenbankobjekt erstellen
    $query  $db->getQuery(true); 
    $query->select
    $this->getState
                                
    'list.select'
                                
    'a.id, a.title, '
                                
    'a.state,'
                                
    'a.publish_up, a.publish_down, a.checked_out, a.checked_out_time, a.ordering' 
                                
    )); 
    $query->from($db->quoteName('#__bestia_mails').' AS a'); // Hier sollen alle Konversationen abgerufen werden 
    // Join over the users for the checked out user. 
    $query->select('uc.name AS editor')  // Hier werden über LEFT JOIN die Namen des Benutzers ausgelesen, der gerade eine Email geöffnet hat (in Joomla gibt es die checked_out-Funktion, die sich in Komponenten sehr gut implementieren lässt
              
    ->join('LEFT''#__users AS uc ON uc.id=a.checked_out'); 
    Das Ergebnis ist hier dann:

    - Konversation 1
    - Konversation 2
    - Konversation 3

    Ich hätte aber gerne ein Ergebnis wie

    - Konversation 1
    -- 5 Mails
    - Konversation 2
    -- 2 Mails
    - Konversation 3
    -- 4 Mails


    Und da stehe ich auf dem Schlauch, wie ich das umsetzen könnte.


    Ich danke euch für eure Antworten - @erc: JOIN und COUNT sind mir bekannt. Ich bekomme aber die Verknüpfung zu meinem Query einfach gedanklich noch nicht hin.
    Ich bitte da um Verzeihung - und ich hoffe, dass sich Dein Kommentar sich nicht wegen des Frustes aufgrund solcher Fragen so ergeben hat.

    Einen Kommentar schreiben:


  • erc
    antwortet
    JOIN, COUNT(), GROUP BY()...


    *edit* und das Forum kotzt mich an!

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    schaue ich mir dein bild an, hast du ja schon alles in der db
    aber mit dem geposteden code von dir kann ich nichts anfangen, sorry.

    Einen Kommentar schreiben:


  • SPQR Inc.
    antwortet
    Hallo moma,
    danke für Deine Antwort, auch wenn ich mir hier eine etwas praktischere Antwort gewünscht hätte. Ich weiß, letztendlich hast Du meine Frage beantwortet. Ich möchte diese daher etwas genauer formulieren: "Wie ist so etwas machbar?".

    Ich kann mir vorstellen, dass ihr hier nicht alles jedem Nutzer vorkauen möchtet - daher freue ich mich auch über Verweise, die mir hier ganz praktisch weiter helfen würden.

    Einen Kommentar schreiben:


  • Gast-Avatar
    Ein Gast antwortete
    Zitat von SPQR Inc. Beitrag anzeigen
    Ist das machbar?
    JA, allerdings musste ja erstmal die emails in die db kriegen, davon sthet wenig in deinem code.
    spiel doch mal damit rum: http://flourishlib.com/docs/fMailbox#fMailbox

    Einen Kommentar schreiben:

Lädt...
X