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

Een berichtenlijst maken in SQL

Ik denk dat je zoekopdracht de "juiste" resultaten oplevert, alsof je het laatste bericht in sommige gesprekken wilt zien, je moet echt groeperen op de conversation_id . Ik zie dit veld echter niet in het schema.

Als u WHERE sender_id = 3 GROUP BY receiver_id . doet , dan is het correct dat die zoekopdracht u berichten 1 en 7 retourneert, omdat die berichten naar andere waren verzonden mensen, dus in jouw ontwerp zijn het verschillende gesprekken.

Als je in het algemeen alleen het allerlaatste bericht wilt zien dat door jou is verzonden, verwijder dan gewoon GROUP BY in het tweede deel van uw UNION . Overweeg anders om uw schema opnieuw te ontwerpen.

BEWERKEN:

Probeer deze zoekopdracht:

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

Enkele opmerkingen:

  1. UNION is niet meer nodig;
  2. Deze aanpak behandelt alle e-mails tussen 2 partijen als één enkel gesprek, wat niet altijd waar is. Misschien wilt u deze benadering opnieuw ontwerpen;
  3. Het is een slechte stijl om gereserveerde woorden te gebruiken (zoals date ) voor namen of aliassen van kolommen, probeer dit te vermijden. Of gebruik backticks als je ze wel gebruikt.



  1. hoe waarden in de rowguid-kolom in te voeren?

  2. SQL Server Management Studio - vind opgeslagen procedure op naam over meerdere databases

  3. hoe de opslagengine van de database in phpmyadmin te wijzigen?

  4. schaduwbericht in Wolfram Workbench 2.0