SQL inner join met subquery

  • Hallo allemaal,


    Ik heb een probleem met mijn lijn SQL code.


    Het idee van de code kan je vergelijken met je berichten op je smartphone (de index, niet 1 specifieke conversatie die je wilt lezen)


    De bedoeling is dat er verschillende conversaties getoond worden en van elke conversatie wordt het laatst gestuurde bericht getoond.


    Dit wil ik dus met de volgende code doen:


    Uiteraard kan ik de conversations.id nog niet gebruiken in de subquery, omdat hij nog niet geselecteerd is.


    Hoe moet ik dit oplossen? Ik heb al redelijk wat gegoogled maar ik geraak er niet aan uit.


    Alvast bedank!


    Vriendelijke groeten,
    Willem

  • Guest, wil je besparen op je domeinnamen? (ad)
  • Een makkelijke manier is denk ik om bij een conversatie bij te houden wat de laatste reactie (het laatste reactie-id) is.


    Je slaat dan weliswaar redundante (afleidbare) informatie op, maar je queries worden dan volgens mij een stuk simpeler :). In dat geval kun je via een simpele INNER JOIN meteen de juiste message.reaction ophalen.

  • Meh, je zou het ook met een subquery kunnen oplossen:


    SQL
    SELECT ...
    FROM conversations c, messages m
    WHERE messages.id = (SELECT MAX(id) FROM messages WHERE conversationId = c.id)
    AND ...
    ORDER BY c.favourite, m.id DESC
    LIMIT 0, 30

    Er vanuitgaande dat er een messages.id kolom is. Moet je trouwens niet ook aflopend sorteren op c.favourite? Eerst de favoriete conversaties, dan de normale?


    Sorteren kan ook op id, immers, de reactionDates volgen dezelfde sortering als id's (een reactie die later gegeven heeft heeft zowel een hoger id als een latere datum).


    Mogelijk moet je nog kijken naar indexen (bijvoorbeeld op messages.conversationId, als je niet al van foreign keys gebruik maakt, in welk geval er al automatisch geindexeerd wordt) om de query efficient te houden.

  • Volgens mij kan het veel eenvoudiger, of ik zit met mijn vermoeide hoofd compleet verkeerd te denken:


    SQL
    SELECT C.name, MAX(M.date) AS last_reaction_date
    FROM conversations AS C
    JOIN messages AS M ON M.conversation_id=C.id
    GROUP BY M.conversation_id
  • Dat zou een makkelijkere oplossing zijn geweest, ware het niet dat de gewenste informatie (onder andere) de laatste message van een conversation is (en niet enkel simpelweg de datum), volgens mij kun je niet garanderen dat je op die manier de laatstgeplaatste message terugkrijgt als je groepeert op datum...


    But feel free to try :).

  • Dat zou een makkelijkere oplossing zijn geweest, ware het niet dat de gewenste informatie (onder andere) de laatste message van een conversation is (en niet enkel simpelweg de datum), volgens mij kun je niet garanderen dat je op die manier de laatstgeplaatste message terugkrijgt als je groepeert op datum...


    But feel free to try :).


    Daar had ik inderdaad overheen gelezen.

Participate now!

Heb je nog geen account? Registreer je nu en word deel van onze community!