MySQL group by
'k Zit hier al heel den dag met te rommelen, .. maar krijg maar niet het gewenste resultaat, .. alle gid zijn natuurlijk gelijk, .. punt is dat het de data van het eerste object weer geeft en dus niet het laatste zoals ik zou willen. Weet iemand hoe ik dit omgekeerd kan weergeven?
ORDER BY gid DESC/ASC
SELECT *,MAX(id) AS list FROM table GROUP BY gid DESC ORDER BY list DESC LIMIT 20
Toevoeging op 27/07/2011 16:01:40:
mysql> SELECT id,gid,max(id) as list FROM table GROUP BY gid order by list desc LIMIT 5;
+----+-----+------+
| id | gid | list |
+----+-----+------+
| 49 | 49 | 97 |
| 23 | 23 | 95 |
| 47 | 47 | 92 |
| 50 | 50 | 91 |
| 88 | 88 | 90 |
+----+-----+------+
mysql> SELECT id,gid FROM table GROUP BY gid desc order by id asc LIMIT 5;
+----+-----+
| id | gid |
+----+-----+
| 22 | 22 |
| 23 | 23 |
| 24 | 24 |
| 26 | 26 |
| 29 | 29 |
+----+-----+
mysql> SELECT id,gid FROM table GROUP BY gid desc order by id desc LIMIT 5;
+----+-----+
| id | gid |
+----+-----+
| 89 | 89 |
| 88 | 88 |
| 79 | 79 |
| 73 | 73 |
| 71 | 71 |
+----+-----+
Toevoeging op 27/07/2011 16:03:58:
toch bedankt voor de poging.
Toevoeging op 27/07/2011 16:06:46:
Dit lost enkel een deel van het probleem op, .. bv ik zou uit één veld ook de informatie willen uitlezen, .. van het max id maar er wordt enkel de eerste table weergegeven max(id) is enkel voor het sorteren, zal waarschijnlijk een join moeten doen of nieuwe query..
GROUP BY is bedoeld om records te groeperen zodat je informatie over die groep records op kunt halen. Direct gevolg is dat je in diezelfde query nooit data van afzonderlijke records uit die groep op kunt halen.
De oplossing met MAX(id) is dan ook niet de juiste, alhoewel dat op eerste gezicht zo lijkt. In werkelijkheid mag je helemaal geen waarde hechten aan een id, aangezien dat enkel gebruikt wordt om een record uniek aan te duiden. Het zegt helemaal niets over een volgorde van verschillende records, een eigenschap die jij nu wel gebruikt. Zet bijvoorbeeld maar eens een backup terug, dan hebben oudere records een hoger id!
Wat wil je precies bereiken, want dat is me nog niet helemaal duidelijk? Wellicht dat we je dan wel de goede kant op kunnen sturen...
nu eigenlijk maak ik een ticket service, .. en dus eerste ticket heeft id en gid dat gelijk is, het antwoordt op het ticket heeft een nieuw id maar zelfde gid als het eerste id, en dus als ik een lijst maak gebruik ik group by komt het niet bovenaan in de lijst, maar ik wil wel het laatst geupdate ticket bovenaan in mijn lijst, dus order by id gaf een verkeerd resultaat door max(id) komt het bovenaan in de lijst.
Gewijzigd op 27/07/2011 16:42:58 door W S
Wat ik begrijp is dat je een overzicht van tickets wilt maken waarbij het ticket waarop het laatst gereageerd is, bovenaan staat. Dan heb je niets aan GROUP BY, ook al lijkt dat in eerste instantie het gewenste resultaat te geven. Wat je zou moeten doen is in een query alle reacties selecteren, gesorteerd op tijd van plaatsen. Met behulp van een JOIN haal je bij elke reactie de gegevens van het bijbehorende ticket op. Nu heb je een resultaatset met alle gewenste data die ook nog eens goed gesorteerd is.
Vervolgens zul je deze resultaatset in PHP uit moeten lezen en moeten zorgen dat het overzicht er goed uit komt te zien. Zo zul je moeten zorgen dat een ticket maar 1x weergegeven wordt. Overigens zou je dit ook nog kunnen bereiken door in je query DISTINCT te gebruiken.