#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 + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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) + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#5 17. Oktober 2011 AW: Maileingang wie bei facebook Warum nicht? ORDER BY created_on und man hat die nachrichten in der richtigen reihenfolge. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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. + Multi-Zitat Zitieren
#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 + Multi-Zitat Zitieren
#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`) + Multi-Zitat Zitieren