[mysql] GROUP BY & MAX(), krij onjuist veld terug naast

Pagina: 1
Acties:

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 11:39
Ik heb hier een query waarbij het article.id niet hoort bij de MAX
(article.articlenumber) functie.

table article:
code:
1
2
3
4
5
6
7
id          articlenumber             node_id
6734     ABC001                      26
6735     MX001                        27
6736     MX002                        27
...
6822     MX103B                      27
6823     MX104                        27



query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
      MAX(article.articlenumber) AS articlenumber,
      article.id,
      article.node_id

FROM article

WHERE
      article.articlenumber < 'MX104'
      AND article.node_id = 27

GROUP BY article.node_id


geeft terug:
code:
1
2
id          articlenumber             node_id
6735     MX103B                      27


terwijl dit moet zijn:
code:
1
2
id          articlenumber             node_id
6822     MX103B                      27



de bedoeling is om een volgend / vorig record knop te maken. Ik heb dit via de search kunnen maken, zonder group by e.d. werkt het uiteraard wel.

wat doe ik hier nu fout?

[ Voor 86% gewijzigd door twiekert op 24-11-2003 15:06 . Reden: ikbenbrakwaardooriknietgoedtyp ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17-08 23:56

Janoz

Moderator Devschuur®

!litemod

Als je functies als sum, max of min wilt gebruiken zul je alle andere velden moeten opnemen in je group by. Om het article.id van degene met het grootste article number terug te krijgen zul je even in je SQL boek naar HAVING moeten zoeken (HAVING MAX(articlenumber) )

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • DizzyWeb
  • Registratie: Februari 2001
  • Nu online

DizzyWeb

Ondertiteld

Wat krijg je dan terug? En wat zou je terug moeten krijgen volgens jou?
Hier kan je niets mee...

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 11:39
DizzyWeb schreef op 24 november 2003 @ 14:58:
Wat krijg je dan terug? En wat zou je terug moeten krijgen volgens jou?
Hier kan je niets mee...

I know, m'n post was dan ook incompleet zoals ik bovenaan gezegd had.
ik was m'n topic title aan het editten en ik drukte op m'n back knop, ipv van tekst weg te halen ging ik een pagina terug, waardoor het topic ook werd gesubmit :?
windows....

  • whoami
  • Registratie: December 2000
  • Laatst online: 11:10
Waarom doe je niet gewoon zo:
code:
1
2
3
4
select max(id), articlenumber
from articles
where node_id = 27
group by articlenumber


En, zoals Janoz al zei: je moet groeperen op alle velden die in je select-list staan en geen aggregated function (sum, count, ....) zijn. Grouperen op ID alleen is niet voldoende, behalve in MySQL dan (maar dat is brak).

[ Voor 46% gewijzigd door whoami op 24-11-2003 15:08 ]

https://fgheysels.github.io/


  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 11:39
ik heb nou deze query in gebruik en werkt OK. Of dit een goeie manier is, is nog de vraag:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT 
   MAX(article.articlenumber) AS articlenumber, 
   article.id 

FROM 
   article 

WHERE 
   article.articlenumber < 'MX018*' 
   AND article.node_id = 27 

GROUP BY 
   article.id 

ORDER BY 
   article.articlenumber DESC

LIMIT 1


ik zal het wat meer toelichten.

De bedoeling is om een aan de hand van het article number het volgende en het vorige record te achterhalen in een bepaalde categorie (=node_id).

Het artikel nummer is echter niet netjes (kan van alles zijn, MX003, 13023, 12BLAAT, AB015*) zoals het auto increment ID. (het is niet mijn idee :P)

Hoe ik HAVING MAX() kan gebruiken weet ik (nog) niet, de mysql documentatie is nogal kort mbt tot deze functie. ik kreeg het in ieder geval niet goed aan de gang.

dit alles op mysql 4.0.14

Verwijderd

Werkt dit ook niet gewoon?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
   article.id, 
   article.articlenumber, 
   article.node_id

FROM 
   article 

WHERE 
   article.articlenumber < 'MX104' 
   AND article.node_id = 27 

ORDER BY 
   article.articlenumber DESC

LIMIT 1


Probleem van je query is dat de GROUP BY wordt uitgevoerd vóór de MAX, er wordt dus éérst "willekeurig" (lees; de eerste die wordt gevonden; er zijn geen garanties te geven welke dit dan zou zijn) een record die voldoet aan de WHERE statement en dáárna pas de MAX() gegeven (welke dus automatisch het ID is van die ene regel omdat er maar één regel is om een MAX() uit te selecteren).
De oplossing die voorgaande poster geeft werkt ook wel echter is het gebruik van MAX() of GROUP BY overbodig aangezien er maar één regel wordt teruggegeven (LIMIT) en wel degene met de het hoogste articlenumber (ORDER BY).

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 11:39
bedankt, dat werkt ook en is een veel betere query. Deze zit tenminste logisch in elkaar :P

moet toch maar is m'n SQL kennis wat opvijzelen, ik doe meestal te moeilijk :)
Pagina: 1