Ik ben bezig aan een berichtensysteem, je kunt namelijk als je op een bericht klikt zien wat de vorige gesprekken allemaal waren in dit bericht (zoals de iphone en facebook) ik werk dan met een conversatie id (conv_id)
stel dat ik nu 5 berichten heb met conv_id = 1
en 5 berichten met conv_id = 2
dan moet ik slechts 2 berichten zien in mijn inbox, dan doe ik een group by op conv_id maar dan maakt hij toch een keuze uit 5 berichten maar welke kiest hij dan eig? hij zou dan de recentste moeten nemen, dus waar bv de datum het grootste is
mysql_query("SELECT van,titel,bericht FROM postmail WHERE naar = '".$_SESSION['gebruiker']."' GROUP BY conv_id ORDER BY datum DESC");
ik heb 2 berichten in de DB gezet en ik krijg er ook slechts 1 van de 2 maar hij moet steeds de nieuwste nemen.
Met order by datum gaat hij de volledige lijst toch sorteren op datum, maar niet BINNEN die groepen van conv_id, snap je me?
Indien je groepeert op conv_id mogen de andere fields (van, titel, bericht) niet in de SELECT-instructie staan. Met uitzondering dat ze voorkomen in een aggregatie-functie (bvb COUNT(van)).
SELECT conv_id FROM postmail WHERE naar='".$_SESSION['gebruiker']."'
SELECT conv_id FROM postmail WHERE naar='".$_SESSION['gebruiker']."'
Deze selecteert de conv-id's die bestaan voro deze gebruiker. en de volgende instructie haalt dan de berichten ophalen (van 1 van deze conv_id), gesorteerd op datum met een limiet van 1 (de laatste)
BTW hetgeen ik zei over GROUP BY blijft gelden (enkel aggregatie-functies in SELECT). ik heb mij wel een beetje verder geinformeerd; in MySQL werkt dit wel (vele andere SQL-producten niet), maar is dit sterk afgeraden.
Ik raad dus ook aan om de SQL_MODE systeemvariabele uit te breiden met ONLY_FULL_GROUP_BY. Zodoende wordt dit ook afgedwongen
De standaard van SQL zegt (vrije verwerking van de standaard):
Citaat:
...standard SQL requires columns referenced in the SELECT list of a query to also appear in the GROUP BY clause, unless these columns appear exclusively in an aggregated expression.