sql >> Database teknologi >  >> Database Tools >> phpMyAdmin

Oprettelse af en meddelelsesliste i SQL

Jeg tror, ​​din forespørgsel giver de "rigtige" resultater, som hvis du gerne vil se den sidste besked i nogle af samtalerne, bør du virkelig gruppere efter conversation_id . Jeg kan dog ikke se dette felt dig i skemaet.

Hvis du gør WHERE sender_id = 3 GROUP BY receiver_id , så er det korrekt, at forespørgslen returnerer dig besked 1 og 7, fordi disse beskeder var blevet sendt til andre mennesker, så i dit design er de forskellige samtaler.

Hvis du kun vil se den allersidste besked, der er sendt af dig generelt, skal du bare fjerne GROUP BY i den anden del af din UNION . Ellers kan du overveje at re-designe dit skema.

EDIT:

Prøv denne forespørgsel:

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)
    );

Nogle bemærkninger:

  1. UNION er ikke længere nødvendig;
  2. Denne tilgang vil behandle alle e-mails mellem 2 parter som en enkelt samtale, hvilket ikke altid er sandt. Du ønsker måske at omdesigne denne tilgang;
  3. Det er en dårlig stil at bruge reserverede ord (som date ) for kolonnenavne eller aliasser, prøv at undgå dette. Eller brug backticks, hvis du bruger dem.



  1. Gemmer data MySQL i kurdisk skrifttype?

  2. Forespørgselsstatistik tager 99 % af forespørgselstiden

  3. Valg af MYSQL-kolonne betinget

  4. MySql #1243 fejl under udførelse af det gennem phpMyAdmin