2016-03-23 6 views
0

Hier ist mein Code, der alle Chat-Nachrichtengruppen und Nachrichten ORDERED BY anzeigt, wenn die Gruppe erstellt wurde.Wie diese MySQL-Abfrage sortieren Gruppen/Nachrichten wie imessage?

Ich versuche, die messagegroup Liste der letzten Nachricht statt (genau wie IMessage oder eine Textnachricht arbeitet)

Sie haben keine Nachrichten zu diesem Zeitpunkt empfangen stattdessen zu bestellen.
<div id="messagegroups"> 
     <?php while($row_messages = mysqli_fetch_assoc($sql_messages)){ ?> 
     <?php 
     $snm = mysqli_query($connect, "SELECT * FROM message_group WHERE group_id = '$row_messages[group_id]' ORDER BY id DESC"); 
     $rm = mysqli_fetch_assoc($snm); 
     $nm = mysqli_num_rows($snm); 

     $ur = mysqli_query($connect, "SELECT * FROM users WHERE username = '$rm[recipients]' ORDER BY id DESC;"); 
     $rr = mysqli_fetch_assoc($ur); 

     $um = mysqli_query($connect, "SELECT * FROM messages WHERE group_id = '$row_messages[group_id]' ORDER BY id DESC;"); 
     $rrr = mysqli_fetch_assoc($um); 

     ?> 
     <div id="messagegroupholder"> 
     <div class="qo cj ca js-msgGroup groupclick" id="msg" data-id="<?php echo $rm['group_id']; ?>"> 
      <a class="b"> 
       <div class="qf"> 
       <span class="qj"> 
       <img class="cu qh" src="./img/<?php echo $rr['image']; ?>" style="height: 42px; width: 42px;"> 
       </span> 
       <div class="qg"> 
        <strong><?php echo $rr['username']; ?></strong> and <strong><?php echo $nm - 1 ?> others</strong> 
        <div class="aof"> 
        <?php echo substr($rrr['message'], 0, 60); ?> &hellip; 
        </div> 
       </div> 
       </div> 
      </a> 
      </div> 
      </div> 
     <?php } ?> 
    <?php } ?> 

    </div> 

MySQL Structure: 

    -- -------------------------------------------------------- 

    -- 
    -- Table structure for table `messages` 
    -- 

    CREATE TABLE IF NOT EXISTS `messages` (
     `id` int(11) NOT NULL AUTO_INCREMENT, 
     `username` varchar(100) NOT NULL, 
     `message` text NOT NULL, 
     `ipaddress` varchar(100) NOT NULL, 
     `timestamp` int(11) NOT NULL, 
     `group_id` varchar(20) NOT NULL, 
     PRIMARY KEY (`id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=318 ; 

    -- -------------------------------------------------------- 

    -- 
    -- Table structure for table `message_group` 
    -- 

    CREATE TABLE IF NOT EXISTS `message_group` (
     `id` int(11) NOT NULL AUTO_INCREMENT, 
     `username` varchar(100) NOT NULL, 
     `recipients` varchar(255) NOT NULL, 
     `group_id` varchar(20) NOT NULL, 
     `ipaddress` varchar(100) NOT NULL, 
     `timestamp` int(11) NOT NULL, 
     PRIMARY KEY (`id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=82 ; 

    -- 
    -- Table structure for table `users` 
    -- 

    CREATE TABLE IF NOT EXISTS `users` (
     `id` int(11) NOT NULL AUTO_INCREMENT, 
     `username` varchar(50) NOT NULL, 
     `email` varchar(50) NOT NULL, 
     `password` varchar(50) NOT NULL, 
     `user_level` int(11) NOT NULL DEFAULT '0', 
     `name` varchar(100) NOT NULL, 
     `image` varchar(100) NOT NULL DEFAULT 'default.png', 
     `profile_background` varchar(255) NOT NULL DEFAULT 'default_background.png', 
     `description` varchar(255) NOT NULL, 
     `went_to_school` varchar(100) NOT NULL, 
     `worked_at` varchar(100) NOT NULL, 
     `lives_in` varchar(100) NOT NULL, 
     `from_originally` varchar(100) NOT NULL, 
     `expires` datetime NOT NULL, 
     `ipaddress` varchar(50) NOT NULL, 
     `browser` varchar(100) NOT NULL DEFAULT 'n/a', 
     `show_email` int(11) NOT NULL DEFAULT '1', 
     `timestamp` int(11) NOT NULL, 
     PRIMARY KEY (`id`) 
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

Hier ist eine Vorschau, wie die Daten gespeichert werden: http://imgur.com/fdG2n0g

So wie kann ich stattdessen die message_groups durch die letzte Nachricht statt, wenn die letzte Gruppe erhielt Bestellung erstellt wurde?

Antwort

0

ersten können Sie eine MAX tun() und GROUP BY die neuesten Zeitstempel für jeden group_id wie

SELECT MAX(timestamp) as latestTimeStamp,group_id 
FROM messages 
GROUP BY group_id 

bekommen Dann könnten Sie diese innere Abfrage Tabelle nennen als M die latestTimeStamp und INNER JOIN, dass mit message_groups mit wie

SELECT MG.*,M.latestTimeStamp 
FROM message_groups MG 
INNER JOIN 
    (SELECT MAX(timestamp) as latestTimeStamp,group_id 
    FROM messages 
    GROUP BY group_id)as M 
ON MG.group_id = M.group_id 
ORDER BY M.latestTimeStamp DESC 
+0

Schön! Ich habe eine weitere GROUP BY group_id hinzugefügt, damit das funktioniert. Du bist ein Mann. Hier ist meine abgeschlossene Abfrage:. MG SELECT *, M.latestTimeStamp VON message_group MG INNER JOIN (SELECT MAX (Timestamp) als latestTimeStamp, group_id VON Nachrichten GROUP BY group_id) als M ON MG.group_id = M. group_id WHERE Benutzername = '$ _SESSION [Benutzername]' OR Empfänger = '$ _SESSION [Benutzername]' GROUP BY group_idORDER BY M.latestTimeStamp DESC – Lukeity