ORDER BY
ik heb een vraagje:
bv ik heb in een tabel forum_posts
dit staan
ID - - - - - - - - - - - hoort_bij - - - datum
5 - - - - - - - - - - - - 2 - - - -- - - - 05/09/06
6 - - - - - - - - - - - - 2 - - - -- - - - 06/09/06
en ik wil alles appart houder per 'hoort_bij' dus gebruik ik GROUP BY en ik wil ook degene uitkomen die het nieuwste is gepost in die tabel:
SELECT * FROM 'forum_posts' GROUP BY 'hoort_bij' ORDER BY 'datum' DESC
maar dan kom ik query ID 5 uit
kan iemand mij helpen?
Gewijzigd op 01/01/1970 01:00:00 door Gilles Van Vlasselaer
Anders eens ASC proberen.
Tip: Gebruik geen quotes om tabelnamen.
SELECT ID, hoort_bij, datum
FROM forum_posts
ORDER BY hoort_bij ASC, datum DESC
dan krijg je ze op volgorde van hoort_bij eruit met de nieuwste datum eerst.
maar er mag maar 1 uitkomst komen met de zelfde hoort_bij
srr voor noob vraagjes mss :)
het is puur een naampje geven aan wat je daarvor (MAX datum) hebt gedaan
ID - - - - - - - - - - - hoort_bij - - - datum
5 - - - - - - - - - - - - 2 - - - -- - - - 05/09/06
6 - - - - - - - - - - - - 3 - - - -- - - - 06/09/06
7 - - - - - - - - - - - - 3 - - - -- - - - 07/09/06
8 - - - - - - - - - - - - 2 - - - -- - - - 08/09/06
gegroepeerd met de hoogst datums?
05/09/06 met 06 als zijnde 2006?
Dan heb je een foute manier van opslaan.
Datums stop je in een DATE of DATETIME veld.
Aanvulling: en het datumformat voor SQL is yyyy-mm-dd
en wat moet ik doen als ik dit nu heb :
ID - - - - - - - - - - - hoort_bij - - - datum
5 - - - - - - - - - - - - 2 - - - -- - - - 2006-09-05
6 - - - - - - - - - - - - 3 - - - -- - - - 2006-09-06
7 - - - - - - - - - - - - 3 - - - -- - - - 2006-09-07
8 - - - - - - - - - - - - 2 - - - -- - - - 2006-09-08
welke query moet ik dan doen om dit uit te komen:
8 - - 2006-09-08
7 - - 2006-09-07
Blijkbaar sorteer je nu ASC (ascending => oplopend), wil je aflopend sorteren (descending) dan heb je DESC nodig.
Quote:
en wat moet ik doen als ik dit nu heb :
ID - - - - - - - - - - - hoort_bij - - - datum
5 - - - - - - - - - - - - 2 - - - -- - - - 2006-09-05
6 - - - - - - - - - - - - 3 - - - -- - - - 2006-09-06
7 - - - - - - - - - - - - 3 - - - -- - - - 2006-09-07
8 - - - - - - - - - - - - 2 - - - -- - - - 2006-09-08
welke query moet ik dan doen om dit uit te komen:
8 - - 2006-09-08
7 - - 2006-09-07
ID - - - - - - - - - - - hoort_bij - - - datum
5 - - - - - - - - - - - - 2 - - - -- - - - 2006-09-05
6 - - - - - - - - - - - - 3 - - - -- - - - 2006-09-06
7 - - - - - - - - - - - - 3 - - - -- - - - 2006-09-07
8 - - - - - - - - - - - - 2 - - - -- - - - 2006-09-08
welke query moet ik dan doen om dit uit te komen:
8 - - 2006-09-08
7 - - 2006-09-07
als ik dit doe via
SELECT * FROM forum_post GROUP BY 'hoort_bij' ORDER BY 'datum' DESC;
dan krijg ik deze results
6 - - - - - - - - - - - - 3 - - - -- - - - 2006-09-06
5 - - - - - - - - - - - - 2 - - - -- - - - 2006-09-05
en ik moet juist de 2 andere hebben want die zijn nieuwer (voor Last post in een forum)
Gewijzigd op 01/01/1970 01:00:00 door Gilles Van Vlasselaer
nog altijd
Wellicht is het gebruik van het * in de query het probleem, haal uitsluitend de gewenste informatie op (benoem de velden) en gebruik evt. een subquery.
Ik weet niet of dit de oplossing is. Een echte oplossing is een betere database te gebruiken, bv. PostgreSQL.
er moet toch een oplossing zijn in MySQL ik heb een betalende host met MySQL :s
GROUP BY biedt de mogelijkheid objecten die door rijen in een tabel worden beschreven, aan de hand van bepaalde met elkaar overeenkomende eigenschappen als 1 groep te beschouwen en over deze groepen vragen te stellen. De groep wordt daarmee op zichzelf ook weer een object met eigenschappen.
Van zo'n groep mag in het resultaat van de query alleen iets worden opgenomen dat de groep als geheel beschrijft.
Dan jouw probleem: Jij wilt de meest recente datum opvragen van een record die in 1 groep staat. Dat kan dus nooit met de huidige query omdat de datum geen eigenschap van de hele groep, maar slechts van 1 record.
MySQL accepteert deze foute query helaas wel. Dat de uitkomst niet klopt, zal MySQL een rotzorg zijn...
Ik zal even in het probleem duiken en zoeken naar een oplossing.
Vraagje: Welke versie van MySQL gebruik je/gebruikt jouw hosting provider?
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
hoort_bij,
MAX(datum) AS laatste_datum
FROM
tabelnaam
GROUP BY
hoort_bij
ORDER BY
laatste_datum DESC,
hoort_bij ASC
hoort_bij,
MAX(datum) AS laatste_datum
FROM
tabelnaam
GROUP BY
hoort_bij
ORDER BY
laatste_datum DESC,
hoort_bij ASC
Het id kun je dus niet opvragen! Wanneer je dat wel wilt, zul je met een subquery moeten gaan werken.
gaat ook niet , ik wil gewoon dat die GROUP BY de laatste datum pakt en niet degene die hij het eerste tegenkomt :s
Let op GROUP BY
vroeger voor GROUP BY.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//ivm uitlijning
naam euries
klaas 3
jan 3
klaas 1
SELECT naam,SUM(euries) AS TOTAAL FROM tabel
klaas 7
jan 7
klaas 7
Nu met group by
SELECT naam,SUM(euries) AS TOTAAL FROM tabel GROUP BY naam
klaas 4
jan 3
naam euries
klaas 3
jan 3
klaas 1
SELECT naam,SUM(euries) AS TOTAAL FROM tabel
klaas 7
jan 7
klaas 7
Nu met group by
SELECT naam,SUM(euries) AS TOTAAL FROM tabel GROUP BY naam
klaas 4
jan 3
Daar is GROUP BY voor en niet voor wat jij wilt. Dus GROUP BY wordt gebruikt icm een BEREKEND gegevens item, oftewel iets wat niet rechtstreeks uit de tabel komt.
Daarvoor gebruik je namelijk WHERE
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven