Toon posts:

[SQL] group by/having werkt niet?

Pagina: 1
Acties:

Verwijderd

Topicstarter
SQL:
1
2
3
4
5
6
7
SELECT e.id AS id, e.translation AS tA, d.translation AS tB, d.revision
FROM English e
LEFT  JOIN  `Dutch` d ON e.id = d.id
WHERE e.ShowIt =1
group by d.id
having d.revision=max(d.revision)
ORDER  BY d.id ASC , e.id ASC


Zie ik heb die sql query... Dit haalt normaal de id, de engelse en de nederlandse vertaling uit een MySQL database (3.23.58). De ID's in de NL & EN tabel zijn exact dezelfde. De ShowIt variable betekend gewoon of ik die virtueel gedelete heb ja of nee.

Wat probeer ik dan? Ik probeer uit mijn databaseke de engelse text + de nederlandse vertaling op te halen die de hoogste 'revisie' heeft (maw de meest recente vertaling). Dit doe ik door te groeperen op id & dan per id de max revision te pakken...

Maar!
Ik heb bvb van id 1 (EN: 'New', NL: 'Nieuw') 4 revisies ('Nief', 'Nieuf', 'Neu', 'Nieuw') ... En die toont em niet... Wel bvb id 2, 3, 4, 5, 6 (dewelke maar 1 revisie hebben!).

Dus! er zit ergens een denkfoutje in mijn redenering... Zou iemand mij misschien kunnen duiden waar?

Verwijderd

volgens mij moet je je groupby nog aanvullen met de velden dat je gebruikt in je select en je having.

Verwijderd

Alleen de Select-velden voldoen. De Having-velden hoef je niet op te nemen, volgens mij.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 13:28

gorgi_19

Kruimeltjes zijn weer op :9

/luie modus:

Sorteer primair aflopend op d.revision en pak de Top 1 (of limit 0,1 in MySQL)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • tazitiz
  • Registratie: Augustus 1999
  • Laatst online: 22-05 21:45

tazitiz

dbprutser

Hoi
volggens mij wil ie zo wel werken...:


SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT e.id AS id, 
             e.translation AS tA, 
             d.translation AS tB,  
             d.revision,
             d.id
             max(d.revision)
FROM English e
LEFT  JOIN  `Dutch` d ON e.id = d.id
WHERE e.ShowIt =1
group by d.id
having d.revision=max(d.revision)
ORDER  BY d.id ASC , e.id ASC

Verwijderd

Topicstarter
tazitiz> Nee ;) geeft dus ook enkel 2->6 weer, maar niet de 1e :D

gorgi_19> Ik heb het zo ongeveer ook opgelost... Gewoon alles afgelopen tot ik aan $amount zat terwijl ik checkte op het revisie nummer en zo dus verplaatste indien nodig.

TheGentleman> Nee, want ik moet hoogste revisie nummer hebben, indien ik de having eruit laat, dan krijg ik niet noodzakelijk de hoogste revisie (bij mijn weten toch).

s-man2> Ik wil groeperen op id, en van elke ID de hoogste revisie pakken, bij mijn weten is dat group by id & having max(revisie)

[ Voor 4% gewijzigd door Verwijderd op 28-12-2003 14:59 ]


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 27-05 23:18

Delphi32

Heading for the gates of Eden

Er zit een denkfout in je query. Alle velden die in je SELECT voorkomen en die geen aggregate zijn (MAX in jouw geval) moeten in je GROUP BY voorkomen. Op het moment dat je dus je A.Translation én B.Translation in je SELECT opneemt, moet je daar ook op gaan groeperen. ik krijg de indruk dat MySQL dat hier automatisch voor je doet of zo, jouw query is iig geen normaal SQL
De HAVING wordt uitgevoerd PER GROUP, die is dus door het voorgaande al niet meer wat je wilt, omdat je groeperen moet op velden waar je niet op wilt groeperen (de B.Translation dus).
De enige manier om hier een sluitend SQL commando tegenaan te gooien is om een sub select te doen:
code:
1
2
3
4
5
6
7
SELECT A.Id, A.Translation, B.Translation
FROM A inner join B on A.Id = B.Id
WHERE B.Revision = (
  SELECT Max(B1.Revision) 
  FROM B AS B1 
  WHERE B1.Id = B.Id
)

Maar volgens mij ondersteunt MySQL niet altijd subselects, hangt af van versienummer als ik me niet vergis. Als je geen subselects mag doen zou je de query kunnen omschrijven zodat je alleen maar A.Id en Max(B.Revision) terugkrijgt en daar dan handmatig de juiste waarden uit B bijzoeken.

[ Voor 1% gewijzigd door Delphi32 op 29-12-2003 00:22 . Reden: Layout :) ]

Pagina: 1