sql >> Databasteknik >  >> Database Tools >> phpMyAdmin

Skapa en meddelandelista i SQL

Jag tror att din fråga ger de "rätta" resultaten, som om du skulle vilja se det sista meddelandet i några av konversationerna borde du verkligen gruppera efter conversation_id . Jag ser dock inte det här fältet du i schemat.

Om du gör WHERE sender_id = 3 GROUP BY receiver_id , då är det korrekt, den frågan returnerar meddelandena 1 och 7, eftersom dessa meddelanden hade skickats till olika människor, så i din design är de olika konversationer.

Om du bara vill se det allra senaste meddelandet som du skickat i allmänhet, ta bara bort GROUP BY i den andra delen av din UNION . Annars kan du överväga att omforma ditt schema.

EDIT:

Testa den här frågan:

SELECT m.message_id, u.username, m.subject, m.message,
       m.status, UNIX_TIMESTAMP(m.date) as `date`
  FROM users u
  LEFT JOIN messages m ON m.sender_id = u.id
 WHERE m.message_id IN (
    SELECT max(message_id) 
      FROM messages
     WHERE receiver_id = 3 OR sender_id = 3
     GROUP BY least(sender_id,receiver_id), 
              greatest(sender_id,receiver_id)
    );

Några anteckningar:

  1. UNION behövs inte längre;
  2. Det här tillvägagångssättet kommer att behandla alla e-postmeddelanden mellan två parter som en enda konversation, vilket inte alltid är sant. Du kanske vill omforma detta tillvägagångssätt;
  3. Det är en dålig stil att använda reserverade ord (som date ) för kolumners namn eller alias, försök att undvika detta. Eller använd backticks om du använder dem.



  1. PHP 7 med phpmyadmin ger massor av avskrivningsmeddelanden

  2. Gruppera tabeller efter schema i SSMS

  3. Visa innehåll i Blob i phpMyAdmin

  4. Generera skript med nya ID (även för beroenden)