Toon posts:

[SQL] Kan dit in een query?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een tabel met daarin versies van artikelen. Een artikel kan meerdere versies hebben en deze versies kunnen ongekeurd, goedgekeurd of afgekeurd zijn.

Tabel definitie:
* id
* artikel_id
* versie
* status
* artikel

artikel_id een uniek nummer per versie, versie is een oplopend nummer per artikel, status: 0=ongekeurd, 1=afgekeurd, 2=goedgekeurd, artike is het artikel zelf :)

Nu wil ik een lijst van alle laatste versies van artikelen die zijn goedgekeurd, maar hoe fix ik dit?

Zelf kwam ik tot het volgende:

SELECT id, artikel FROM artikelversies WHERE status=2 GROUP BY artikel_id HAVING version=max(version)

Maar doordat de group by gebeurd voor dat de having clause wordt gechecked klopt het voor geen meter.

Hoe is dit toch in een query mogelijk :?

Verwijderd

Sub query gebruiken maar dat ligt eraan wat voor DB je gebruikt......... (MySQL kan dat nog niet :X )

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
Selecteer gewoon alle hoogste versienummers van ieder product:
code:
1
2
3
select max(versie), artikel
from tabel
group by artikel


Nu moet je er alleen nog voor zorgen dat er enkel rekening gehouden wordt met de goedgekeurde versies. Dit zul je moeten doen in de WHERE en niet in de having, aangezien die filter moet gebeuren voor de aggregated function:
code:
1
2
3
4
select max(versie), artikel
from tabel
where status = 2
group by artikel

https://fgheysels.github.io/


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
Ik weet niet of dit bij jou werkt, maar in T-SQL werkt het in ieder geval wel.
code:
1
2
3
4
SELECT A.ID, A.Versie, A.Artikel
FROM   ArtikelVersies A
WHERE  Versie =
       ( SELECT MAX(B.Versie) FROM ArtikelVersies B WHERE B.ArtikelID = A.ArtikelID AND B.Status=2)

[ Voor 11% gewijzigd door maikel op 17-02-2003 22:36 ]


Verwijderd

Topicstarter
Laat maar jongens, ik ben er al weer uit: een join op dezelfde tabel:

SELECT a1.article_id, max( a1.version ) AS maxversion, a2.*
FROM articleversie a1, articleversie a2
WHERE a1.STATUS = 2 AND a1.article_id = a2.article_id AND a1.version = a2.version
GROUP BY a1.file_id

Thnx anyway :)

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
Dat zeg ik. :)

Verwijderd

Topicstarter
maikel schreef op 17 February 2003 @ 22:33:
Ik weet niet of dit bij jou werkt, maar in T-SQL werkt het in ieder geval wel.
code:
1
2
3
4
SELECT A.ID, A.Versie, A.Artikel
FROM   ArtikelVersies A
WHERE  Versie =
       ( SELECT MAX(B.Versie) FROM ArtikelVersies B WHERE B.ArtikelID = A.ArtikelID AND B.Status=2)
Was leuk geweest, maar ik was vergeten te vermelden dat het op mysql moet draaien (geen sub-queries).

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
Was mijn oplossing niet afdoende? (en eenvoudiger, en sneller?)

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op 17 February 2003 @ 22:37:
Was mijn oplossing niet afdoende? (en eenvoudiger, en sneller?)
Niet afdoende, omdat bij jou query de kolom arikel niet perse het artikel met het hoogste versienummer hoeft te bevatten.

Verwijderd

whoami schreef op 17 February 2003 @ 22:37:
Was mijn oplossing niet afdoende? (en eenvoudiger, en sneller?)
Lijkt me wel.....

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
Hoe bedoel je?
Ik ga er nl. vanuit dat je bv deze data hbt:
id artikel_id versie status artikel
1 1 1 2 artikel 1
2 1 2 2 artikel 1
3 2 1 2 artikel 2
4 2 2 0 artikel 2


Mijn query zou in dat geval dan als resultaat geven:
versie artikel
2 artikel 1
1 artikel 2


Ik heb wel nog een aanmerking op jouw datamodel. Waarom heb je geen tabel 'artikel', met daar voor ieder artikel een id en de naam van dat artikel, en dan nog een tabel versie, waarin je voor ieder artikel de bestaande versies voor dat artikel bijhoudt?

https://fgheysels.github.io/


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
whoami schreef op 17 February 2003 @ 22:44:
Hoe bedoel je?
Ik ga er nl. vanuit dat je bv deze data hbt:
id artikel_id versie status artikel
1 1 1 2 artikel 1
2 1 2 2 artikel 1
3 2 1 2 artikel 2
4 2 2 0 artikel 2


Mijn query zou in dat geval dan als resultaat geven:
versie artikel
2 artikel 1
1 artikel 2


Ik heb wel nog een aanmerking op jouw datamodel. Waarom heb je geen tabel 'artikel', met daar voor ieder artikel een id en de naam van dat artikel, en dan nog een tabel versie, waarin je voor ieder artikel de bestaande versies voor dat artikel bijhoudt?
Ik neem aan dat die artikelen per versie ook iets verschillen (waarom anders meerdere versies?). Dan krijg je dus per nieuw record in de versie-tabel, ook een nieuw record in de artikel-tabel. En de relatie onderling is dan 1 op 1. Dan kan het mi net zo goed in 1 tabel.

En The_dude, jij zegt dat mijn mogelijkheid niet werkt, maar zelf gaf je aan dezelfde manier te gebruiken. :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
[nohtml]
maikel schreef op 17 February 2003 @ 23:01:
[...]


Ik neem aan dat die artikelen per versie ook iets verschillen (waarom anders meerdere versies?). Dan krijg je dus per nieuw record in de versie-tabel, ook een nieuw record in de artikel-tabel. En de relatie onderling is dan 1 op 1. Dan kan het mi net zo goed in 1 tabel.
Neen, ik veronderstel van niet. ;)

Stel, je hebt een product: MS Office. Die heeft ook verschillende versies, en iedere versie heeft andere functionaliteiten, maar het produkt blijft wel Office.

https://fgheysels.github.io/


  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
whoami schreef op 17 February 2003 @ 23:04:
[nohtml]
[...]

Neen, ik veronderstel van niet. ;)

Stel, je hebt een product: MS Office. Die heeft ook verschillende versies, en iedere versie heeft andere functionaliteiten, maar het produkt blijft wel Office.
Dan is inderdaad jouw manier beter, maar ik ging er dus vanuit dat de artikelen zelf ook wijzigen: naamswijziging bijvoorbeeld (uit ervaring, toen heb ik hier ook naar zo'n SQL-statement gevraagd, vandaar dat ik 'm wist :) ). Maar dat is afhankelijk van het soort artikelen natuurlijk.

Verwijderd

Topicstarter
maikel schreef op 17 februari 2003 @ 23:01:
[...]


Ik neem aan dat die artikelen per versie ook iets verschillen (waarom anders meerdere versies?). Dan krijg je dus per nieuw record in de versie-tabel, ook een nieuw record in de artikel-tabel. En de relatie onderling is dan 1 op 1. Dan kan het mi net zo goed in 1 tabel.

En The_dude, jij zegt dat mijn mogelijkheid niet werkt, maar zelf gaf je aan dezelfde manier te gebruiken. :)
Met het subtiele verschil dat ik join op dezelfde tabel over de file_id en versienr. In jou versie ga je er vanuit dat het versienr wat er uit komt bij max(versie) gelijk is aan de versienr van het artikel dat je query per row op levert, dit is echter geen juiste veronderstelling.
Met de Group By heb je geen controle over welk artikel versie hij nu pakt van alle artikelversies met dat file_id.

Verwijderd

Topicstarter
whoami schreef op 17 February 2003 @ 23:04:
[nohtml]
[...]

Neen, ik veronderstel van niet. ;)

Stel, je hebt een product: MS Office. Die heeft ook verschillende versies, en iedere versie heeft andere functionaliteiten, maar het produkt blijft wel Office.
In mijn case is het zo dat de artikel versies natuurlijk verschillen, anders zou het goedkeuren redelijk nutteloos zijn :)

  • Sjeng
  • Registratie: Juli 2001
  • Laatst online: 10-12-2025
Verwijderd schreef op 17 February 2003 @ 22:31:
Sub query gebruiken maar dat ligt eraan wat voor DB je gebruikt......... (MySQL kan dat nog niet :X )
Update: MySQL kan dit vanaf versie 4.1 dus wel. Zie ook http://www.mysql.com/press/release_2003_05.html

Verwijderd

Topicstarter
Sjeng schreef op 18 February 2003 @ 10:02:
[...]
Update: MySQL kan dit vanaf versie 4.1 dus wel. Zie ook http://www.mysql.com/press/release_2003_05.html
Dat weten we wel, maar 4.1 wordt hier nog niet gebruikt.

Mijn oplossing is trouwens niet correct!
Ik had een fout gemaakt: a1.version=a2.version had in mijn gedachte maxversion=a2.version moeten zijn, maar dat gaat dus leuk niet werken :(

Iemand een mooie oplossing?

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
Verwijderd schreef op 18 February 2003 @ 09:54:
[...]


Met het subtiele verschil dat ik join op dezelfde tabel over de file_id en versienr. In jou versie ga je er vanuit dat het versienr wat er uit komt bij max(versie) gelijk is aan de versienr van het artikel dat je query per row op levert, dit is echter geen juiste veronderstelling.
Met de Group By heb je geen controle over welk artikel versie hij nu pakt van alle artikelversies met dat file_id.
Ik heb dat statement in mijn geval ook gebruikt en dat werkte perfect hoor.
En in mijn statement stond ook geen Group By. Haal je nu niet die van mij en van whoami door elkaar?

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:37
Misschien is het een idee om jouw datamodel eens te herzien, zoals ik al eerder postte.

Echter, als wij niet weten hoe die data er nu uiteindelijk uit ziet (zie posts van mij en van maikel), dan kunnen wij ook niet 100% met juistheid zeggen hoe jouw query er moet uit zien.

https://fgheysels.github.io/


Verwijderd

Topicstarter
maikel schreef op 18 februari 2003 @ 10:39:
[...]


Ik heb dat statement in mijn geval ook gebruikt en dat werkte perfect hoor.
En in mijn statement stond ook geen Group By. Haal je nu niet die van mij en van whoami door elkaar?
Ik had jullie idd door elkaar gehaald. Maar jij bedoeld die query met een sub-query?

  • maikel
  • Registratie: Januari 2001
  • Laatst online: 12:52
Verwijderd schreef op 18 February 2003 @ 10:51:
[...]


Ik had jullie idd door elkaar gehaald. Maar jij bedoeld die query met een sub-query?
|:(
Ik had inderdaad een sub-query gepost, maar daar had ik zelf overheen gelezen. :)
Komt waarschijnlijk omdat ik wel aan een join zat te denken, maar vervolgens de query uit een ander topic (waarin ik dezelfde vraag stelde) heb gecopy/paste. En daar stond dus ipv een join een sub-query in. Even niet goed op gelet dus.

Verwijderd

Topicstarter
maikel schreef op 18 February 2003 @ 11:06:
[...]


|:(
Ik had inderdaad een sub-query gepost, maar daar had ik zelf overheen gelezen. :)
Komt waarschijnlijk omdat ik wel aan een join zat te denken, maar vervolgens de query uit een ander topic (waarin ik dezelfde vraag stelde) heb gecopy/paste. En daar stond dus ipv een join een sub-query in. Even niet goed op gelet dus.
Welk topic is dat?
Pagina: 1