MySQL group by
SELECT * FROM table GROUP BY gid DESC ORDER BY id DESC LIMIT 20
'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?
'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
geprobeerd en nee dat werkt niet hier is de oplossing dit is blijkbaar een veel voorkomend probleem, aangezien gid "group by gid" is zijn ze allemaal hetzelfde dus asc/desc werken niet en order by id werkt niet omdat er maar 1 id wordt weer gegeven, .. heb veel oplossingen gevonden met joins en zovoorts, maar uiteindlijk heb ik het zelf kunnen vinden heeft wel heel de dag in beslag genomen maar het werkt hehe
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..
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..
Niet om het een of ander, maar de database doet precies wat jij in die query van hem vraagt. Jij gebruikt GROUP BY op een incorrecte manier waardoor je dit resultaat krijgt.
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...
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...
normaal als je een backup maakt back je de id's ook op, omdat ik id gebruik als link naar andere tables. ik zie niet in waarom je een backup maakt je de id's niet zou backup'en.
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.
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
Als je iets wilt sorteren op moment van plaatsen, zul je bij elk record ook een datumtijdstempel op moeten slaan. Daar kun je dan op sorteren.
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.
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.




