[PHP] Maileingang wie bei facebook

Dieses Thema im Forum "Webentwicklung" wurde erstellt von Atkaz, 16. Oktober 2011 .

Schlagworte:
  1. 16. Oktober 2011
    Maileingang wie bei facebook

    Moisen,


    Leute ich habe grade einen kleinen Blackout. Ich möchte einen Maileingang wie bei facebook einrichten, doch Irgendwie stehe ich auf dem Schlauch.

    Meine Tabellen sehen wie folgt aus :

    // Eingang
    Code:
    CREATE TABLE user_message_in (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `conversation_id` int(11) NOT NULL,
     `user_id` int(11) NOT NULL,
     `partner_id` int(11) NOT NULL,
     `titel` varchar(255) NOT NULL,
     `message` text,
     `settings` varchar(255),
     `read` int(1) DEFAULT '0',
     `created_on` int(15) NOT NULL,
     PRIMARY KEY (`id`)
     )ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    
    // Ausgang
    Code:
    
    
    CREATE TABLE user_message_out (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `conversation_id` int(11) NOT NULL,
     `user_id` int(11) NOT NULL,
     `partner_id` int(11) NOT NULL,
     `titel` varchar(255) NOT NULL,
     `message` text,
     `settings` varchar(255),
     `read` int(1) DEFAULT '0',
     `created_on` int(15) NOT NULL,
     PRIMARY KEY (`id`)
     )ENGINE=InnoDB DEFAULT CHARSET=utf8
    
    Wie bekomme ich nun die gewünschte Verknüpfung hin.JOIN, SELECT ?

    Hab beides ausprobiert, doch es funktioniert nicht.

    Ich würde mich freuen, wenn mir da jemand auf die Sprünge helfen könnte.

    mfg
    atkaz
     
  2. 17. Oktober 2011
    AW: Maileingang wie bei facebook

    Hey,

    also nach kurzem nachdenken, glaube ich, dass es mit einem Query nicht so einfach funktioniert. Aber das erste was mir den den Kopf gekommen ist, ist warum du zwei Tabellen verwendest?Eine reicht doch völlig aus. ein Boolean Flag für Out oder In würde hier ausreichen. Dann kannst du mit "SELECT * FROM messages WHERE conversation_id = 'x' ORDER BY created_on DESC" alle passenden Messages auslesen


    Wäre meiner Meinung nach einfacher



    Gruß Blackb!rd
     
  3. 17. Oktober 2011
    AW: Maileingang wie bei facebook

    Abfragen über mehrere Tabellen funktionieren mit UNION (MySQL :: MySQL 5.1 Referenzhandbuch :: 13.2.7.2 UNION)
     
  4. 17. Oktober 2011
    AW: Maileingang wie bei facebook

    Ich glaueb nicht das man aber damit abwechselnd aus den Tabellen einträge bekommt, so wie er es benötigt, oder? Habe noch nie mit UNION gearbeitet, daher kann ich da keine 100%tige Aussage treffen!

    Gruß Blackb!rd
     
  5. 17. Oktober 2011
    AW: Maileingang wie bei facebook

    Warum nicht? ORDER BY created_on und man hat die nachrichten in der richtigen reihenfolge.
     
  6. 18. Oktober 2011
    AW: Maileingang wie bei facebook

    Danke erstmal für die Antwort. Das mit Union schein zu funktionieren. Das Problem besteht jetzt darin,wie man die Auflistung der Mails darstellen soll.

    hab folgendes Ausprobiert:


    Code:
    (SELECT m_in.* 
     FROM "user_messages_in as m_in 
     WHERE receiver_id = $id 
     GROUP BY m_in.conversation_id ) 
     UNION
     (SELECT m_out.* 
     FROM user_messages_out as m_out 
     WHERE m_out.sender_id = $id)
    Doch irgendwie liegt da der gedankenfehler drin. Mein Problem besteht jetzt nicht darin wie ich die Datensätze aus beiden Tabellen hole, sondern wie ich das ganze mit Group By gruppieren kann, so dass am ende nur ein Datensatz übrig bleibt.

    Würde mich freuen, wenn jemand ne lösung zu hätte.
     
  7. 18. Oktober 2011
    AW: Maileingang wie bei facebook

    Wieso möchtest du am Ende nur einen Datensatz haben?

    Du möchtest doch eher alle Datensätze einer Konversation (alle Datensätze mit gleicher conversation_id).
    Um eine Übersicht über alle Konversationen zu erstellen könntest du dann GROUP BY verwenden.

    Evtl. verstehe ich dein Vorhaben aber auch falsch.
     
  8. 19. Oktober 2011
    AW: Maileingang wie bei facebook

    Sorry, Vielleicht habe ich mich unklar ausgedrückt.

    Ich möchte zusätzlich zu den einzelnen Datensätzen der Konversation einer Komprimierte Liste mit den Emails ausgeben, die ein Benutzer entweder erhalten oder versendet hat. Es soll hal so wie bei facebook sein. In der Liste wird die Konversation mit dem Betreff und der Aktuellen nachricht ausgegeben z.b:


    Betreff
    aktuelle Nachricht...

    ich habe das ganze jetzt wie folgt gelöst :

    Code:
    SELECT t.*
     FROM ".$this->db->dbprefix("user_messages_in")." as t
     JOIN ( SELECT titel,user_id,message,conversation_id, MAX(created_on) AS created_on
     FROM ".$this->db->dbprefix("user_messages_out")."
     GROUP BY conversation_id ) g
     
     ON g.conversation_id = t.conversation_id
     WHERE g.user_id = $id OR t.user_id=$id
     GROUP BY conversation_id
     ORDER BY created_on ASC
    
    
    Das Problem besteht jetzt darin, dass ich nciht die aktuelle bzw. die letze nachricht unter dem Betreff bekomme. Kennst einer eine lösung?


    Ein weiteres Problem was ich nun habe besteht darin, den Namen des absenders bzw. der empfängers zu ermittelt. Die Nachrichten werden wie folgt dargestellt:

    Code:
     SELECT * FROM ( 
     (SELECT m_in.* 
     FROM ".$this->db->dbprefix("user_messages_in")." as m_in 
     WHERE conversation_id = $con_id AND m_in.user_id = $user_id )
     UNION 
     (SELECT m_out.* 
     FROM ".$this->db->dbprefix("user_messages_out")." as m_out 
     WHERE conversation_id = $con_id AND m_out.user_id = $user_id ) ORDER BY created_on ASC) as m
     JOIN ".$this->db->dbprefix("profiles")." as profiles
     ON m.partner_id = profiles.user_id
    "
    doch irgendwie bin ich mit disem user und partner id durcheinander gekommen, so dass immer nur 1 name ausgegeben wird.
     
  9. 20. Oktober 2011
    AW: Maileingang wie bei facebook

    Sooo...habs nun

    sollte jemand das gleichve vorhaben, bitte schön:

    Mailliste :

    Code:
    
    "SELECT *,CONCAT(first_name,last_name) as full_name FROM (
     SELECT conversation_id,
     message,
     receiver_id,
     sender_id,
     created_on,
     IF(m_in.receiver_id <>$id, 
     m_in.receiver_id,m_in.sender_id) AS partnerId
     FROM user_messages_in AS m_in
     WHERE m_in.receiver_id = $id 
     UNION 
     SELECT conversation_id,
     message,
     receiver_id,
     sender_id,
     created_on,
     IF(m_out.sender_id <>$id, 
     m_out.sender_id,m_out.receiver_id) AS partnerId
     FROM user_messages_out AS m_out
     WHERE m_out.sender_id = $id 
     ORDER BY created_on DESC
     ) as m_data
     INNER JOIN ".$this->db->dbprefix("profiles")." as user
     ON user.user_id = m_data.partnerId
     GROUP BY m_data.conversation_id
    
    
    Mailbox:
    Code:
    SELECT * FROM(
     SELECT conversation_id,titel,message,created_on,receiver_id,sender_id,CONCAT(first_name,last_name) AS full_name
     FROM user_messages_in as m_in
     INNER JOIN profiles AS profile
     ON m_in.sender_id = profile.user_id 
     WHERE conversation_id = $con_id AND m_in.receiver_id = $user_id 
     
     UNION
     SELECT conversation_id,titel,message,created_on,receiver_id,sender_id,CONCAT(first_name,last_name) AS full_name
     FROM user_messages_in AS m_out
     JOIN profiles AS profile 
     ON m_out.sender_id = profile.user_id 
     WHERE conversation_id = $con_id AND m_out.sender_id = $user_id
     )as msg ORDER BY msg.created_on ");
    
    
    Sollte jemand noch verbesserungsvorschläge haben, würde ich mich freuen, wenn dieser diese posten würde.

    mfg
    atkaz
     
  10. 20. Oktober 2011
    AW: Maileingang wie bei facebook

    damit solltest du die gleichen ergebnisse bekommen:
    Code:
    SELECT
     DISTINCT
    
     msg.`conversation_id`, msg.`titel`, msg.`message`,
     msg.`created_on`, msg.`receiver_id`, msg.`sender_id`,
     
     CONCAT(prf.`first_name`, prf.`last_name`) AS full_name
     
    FROM `user_messages` AS msg
    
    LEFT JOIN `profiles` AS `prf` ON ( prf.`user_id` = msg.`sender_id` )
    
    WHERE 
     msg.`conversation_id` = $con_id
     && $user_id IN(msg.`sender_id`, msg.`receiver_id`)
     
  11. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.