login  Naam:   Wachtwoord: 
Registreer je!
 Forum

group by probleem

Offline daanlaan - 06/01/2011 18:28 (laatste wijziging 06/01/2011 18:29)
Avatar van daanlaanMySQL interesse 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

9 antwoorden

Gesponsorde links
Offline Stefan14 - 07/01/2011 05:01
Avatar van Stefan14 PHP gevorderde volgens mij kun je inderdaad een group by op het conversatie id doen, gevolgd door een order by op de datum. Denk dat dat je probleem oplost.
Offline daanlaan - 10/01/2011 21:07
Avatar van daanlaan MySQL interesse Dit is mijn query

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?
Offline Beirensg - 11/01/2011 10:27
Avatar van Beirensg HTML beginner 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)).

Ik zou de SELECT-instructies opslitsen:
  1. 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)
  1. SELECT van,titel,bericht FROM postmail WHERE ((naar = '".$_SESSION['gebruiker']."')AND(conv_id='".$result_conv_id[0]."'))ORDER BY datum DESC,LIMIT 1


Deze laatste instructie kan je dan herhalen voor elke conv_id gevonden (php foreach)
Offline daanlaan - 11/01/2011 18:27 (laatste wijziging 11/01/2011 23:00)
Avatar van daanlaan MySQL interesse dus je wilt dat ik voor elke conv_id een nieuwe query ga doen ofwat???
en als hij dan 1000 mails heeft 
Offline vinTage - 12/01/2011 00:12 (laatste wijziging 12/01/2011 00:42)
Avatar van vinTage Nieuw lid geen reactie meer op irc, dus dan maar hier.

mijn test omgeving:
  1. INSERT INTO `test` (`id`, `voornaam`, `conv_id`, `datum`) VALUES
  2. (1, 'aap', 55, '2011-01-11'),
  3. (2, 'beep', 55, '2011-01-12'),
  4. (3, 'ceep', 33, '2011-01-13'),
  5. (4, 'daav', 12, '2011-01-26');

en mijn query:
  1. SELECT max( datum ) , id, voornaam, datum
  2. FROM test
  3. GROUP BY conv_id
  4. ORDER BY datum

resultaat:
  1. 2011-01-12 1 aap 2011-01-11
  2. 2011-01-13 3 ceep 2011-01-13
  3. 2011-01-26 4 daav 2011-01-26



edit: Na je weer op irc gesproken te hebben...Je had beter hier gezet wat er fout was in mijn ding 
  1. SELECT *
  2. FROM test t1
  3. WHERE Datum = (
  4. SELECT MAX( Datum )
  5. FROM test t2
  6. WHERE t1.conv_id = t2.conv_id )


resultaat:
  1. 2 beep 55 2011-01-12
  2. 3 ceep 33 2011-01-13
  3. 4 daav 12 2011-01-26
Offline Beirensg - 12/01/2011 09:33
Avatar van Beirensg HTML beginner Volledig gelijk, zo werkt het in 1 query.

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

Offline vinTage - 12/01/2011 10:29
Avatar van vinTage Nieuw lid waaduh  
Offline Beirensg - 12/01/2011 10:43 (laatste wijziging 12/01/2011 10:49)
Avatar van Beirensg HTML beginner Meer info vind je onder andere hier:
http://dev.mysq...myths.html

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.


volgend voorbeeld kan bvb problemen geven:
  1. SELECT field1,field2 FROM TABLE GROUP BY field1


Field1 zal geen probleem geven, maar de waarde van field2 in deze query is niet te voorspellen!!!

Daarom ben ik voorstander om enkel aggregatiefunctie ste gebruiken in de SELECT, bvb:
  1. SELECT field1,MAX(field2) FROM TABLE GROUP BY field1

Offline vinTage - 12/01/2011 11:33
Avatar van vinTage Nieuw lid maar er is geen group by meer 
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.188s