Toon posts:

[sql] query samenstellen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Op een tabel wordt de volgende qeury gedaan om 4 recente nieuwsberichten te tonen op de website:
code:
1
2
3
4
5
6
Set Record = Server.CreateObject("ADODB.Recordset")
Record.MaxRecords = 4
SQLStmt_berichten = "SELECT * FROM Berichten "
SQLStmt_berichten = SQLStmt_berichten & " WHERE redactiecontrole = 1 AND eindredactiecontrole = 1 and datum_publicatie<='"&Vdatumvandaag&"' and datum_archief>='"&Vdatumvandaag&"' "
SQLStmt_berichten = SQLStmt_berichten & " ORDER by datum_publicatie DESC, titel "
Record.Open SQLStmt_berichten, connectie, adOpenStatic, adLockReadOnly, adCmdText


De volgende uitbreiding is wenselijk:
De tabel Berichten bevat een kolom congres, deze kan 0 of 1 zijn.
Het totaal aantal berichten van 4 moet gelijk blijven echter hiervan 2 nieuwsberichten (congres = 0) en 2 congressen (congres = 1), georderd opdezelfde manier als hierboven in de query. Blijkt dat er geen 2 congressen voldoen aan de query dan opvullen met nieuwsberichten. Dus als er geen congressen zijn 4 nieuwsberichten tonen etc..

Kan dit in 1 qeury gezet worden?

Nu zit ik volgens mij erg omslachtig eerste het aantal congressen te tellen om te bepalen wat de maxrecord voor nieuws en congressen is. Daarna moet ik de id's in een goede volgorde zetten qua datum en dan een qeury met een WHERE id_bericht IN (id, id, id, id) om daadwerkelijk de informatie te tonen.

Heeft iemand advies voor mij?
Gr Niek

  • Lorn
  • Registratie: Maart 2000
  • Laatst online: 13-01-2025

Lorn

I have a bad feeling...

Of het een hele goede oplossing is weet ik niet maar je kunt het SQL commando TOP gebruiken, ik weet alleen niet zeker of dit standaard SQL is of alleen T-SQL (MS SQL Server).

Je kunt dan twee queries maken die ieder de top 2 records ophalen en deze middels een UNION als een recordset laten teruggeven.

Maar wellicht dat iemand anders een beter oplossing heeft...

Edit: Goed lezen is ook een kunst. Had even niet gezien dat als er van 1 type niet voldoende berichten zijn dat moet worden aangevuld met berichten van het andere type. Mijn oplossing is dus maar deels toepasbaar. Sorry!

[ Voor 24% gewijzigd door Lorn op 26-04-2006 15:30 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-02 14:52

gorgi_19

Kruimeltjes zijn weer op :9

Dmv van Union kan je ze krijgen :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
ik kan inderdaad voor twee query's zorgen, ga even googlen voor union
bedankt!

  • tazzman
  • Registratie: Juli 2000
  • Laatst online: 05-01 10:48

tazzman

a real boardmonkey

Maar op welke query ga je je top plaatsen?

Volgens mij zou zoiets prima moeten werken:

SELECT TOP 4 alle_berichten.*
FROM
(SELECT * FROM berichten WHERE type = 'congres'
UNION
SELECT * FROM berichten WHERE type = 'nieuws') alle_berichten
ORDER BY alle_berichten.plaasting_datumtijd DESC

Het nieuwe speelgoed: een Saab 9-3 Aero (absoluut, helemaal en compleet fantastisch....)


Verwijderd

Topicstarter
tazzman, jou qeury werkt, maar dan moet ik wel van te voren weten hoeveel type=congres er is op een tweede top de maken.
Ik maak 1 extra qeury die een count doet van het aantal type=congres, hieruit kan ik het aantal type=congres en type=nieuws distilleren en dan de qeury:
code:
1
2
3
4
5
6
SELECT TOP 4 alle_berichten.*
FROM
(SELECT TOP "&Vcountcongres&" * FROM berichten WHERE type = 'congres'
UNION
SELECT TOP "&Vcountnieuws&"* FROM berichten WHERE type = 'nieuws') alle_berichten
ORDER BY alle_berichten.plaasting_datumtijd DESC


Ik vraag me alleen af of de hoofd SELECT TOP 4 alle_berichten.* dan nog wel mag?

Het is query, niet qeury :)

[ Voor 9% gewijzigd door whoami op 26-04-2006 22:29 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-02 14:52

gorgi_19

Kruimeltjes zijn weer op :9

Je moet je TOP op het gedeelte van het congres plaatsen; door de UNION wordt de rest dan vanzelf aangevuld.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • tazzman
  • Registratie: Juli 2000
  • Laatst online: 05-01 10:48

tazzman

a real boardmonkey

Het ligt er aan wat je wilt, mijn query haalt gewoon de laatste 4 berichten op, ongeacht welke soort. Zijn dat 4 congres berichten, dan krijg je geen nieuws berichten.

Het nieuwe speelgoed: een Saab 9-3 Aero (absoluut, helemaal en compleet fantastisch....)


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-02 14:52

gorgi_19

Kruimeltjes zijn weer op :9

tazzman schreef op woensdag 26 april 2006 @ 22:48:
Het ligt er aan wat je wilt, mijn query haalt gewoon de laatste 4 berichten op, ongeacht welke soort. Zijn dat 4 congres berichten, dan krijg je geen nieuws berichten.
Klopt, maar dat wilde hij niet :) Voor wat jij doet heb je geen UNION nodig :)
Het totaal aantal berichten van 4 moet gelijk blijven echter hiervan 2 nieuwsberichten (congres = 0) en 2 congressen (congres = 1), georderd opdezelfde manier als hierboven in de query. Blijkt dat er geen 2 congressen voldoen aan de query dan opvullen met nieuwsberichten

[ Voor 4% gewijzigd door gorgi_19 op 26-04-2006 22:52 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • tazzman
  • Registratie: Juli 2000
  • Laatst online: 05-01 10:48

tazzman

a real boardmonkey

gorgi_19 schreef op woensdag 26 april 2006 @ 22:51:
[...]

Klopt, maar dat wilde hij niet :) Voor wat jij doet heb je geen UNION nodig :)

[...]
Erm dat klopt. Ik was een beetje in de bonen denk ik... Je hebt helemaal gelijk, my bad. 8)7

Het nieuwe speelgoed: een Saab 9-3 Aero (absoluut, helemaal en compleet fantastisch....)


Verwijderd

Topicstarter
Yep, top mannen,

Dit is het geworden:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
SQLStmt_congres = "SELECT count(id_bericht) as contCongres FROM Berichten "
SQLStmt_congres = SQLStmt_congres & " WHERE redactiecontrole = 1 AND eindredactiecontrole = 1 and congres = 1 and datum_publicatie<='"&Vdatumvandaag&"' and datum_archief>='"&Vdatumvandaag&"' "
Set resultaatcongres = connectie.Execute(SQLStmt_congres)
VcontCongres = resultaatcongres("contCongres")
If VcontCongres = 0 THEN 
Vnieuws = 4
Vcongres = 0
elseif VcontCongres = 1 THEN 
Vnieuws = 3
Vcongres = 1
elseif VcontCongres = 2 THEN 
Vnieuws = 2
Vcongres = 2
else
Vnieuws = 2
Vcongres = 2
end if

SQLStmt1 = "SELECT * FROM Berichten WHERE redactiecontrole = 1 AND eindredactiecontrole = 1 and datum_publicatie<='"&Vdatumvandaag&"' and datum_archief>='"&Vdatumvandaag&"' "
SQLStmt2 = "SELECT TOP "&Vcongres&" * FROM Berichten WHERE  congres = 1 and datum_publicatie<='"&Vdatumvandaag&"' and datum_archief>='"&Vdatumvandaag&"'"

Set Record = Server.CreateObject("ADODB.Recordset")
SQLStmt_berichten = "SELECT TOP 4 Berichten.* FROM ("
SQLStmt_berichten = SQLStmt_berichten & SQLStmt2 & "UNION "
SQLStmt_berichten = SQLStmt_berichten & SQLStmt1 & ") Berichten "
SQLStmt_berichten = SQLStmt_berichten & " ORDER by datum_publicatie DESC, titel "
'response.write(SQLStmt_berichten)
Record.Open SQLStmt_berichten, connectie, adOpenStatic, adLockReadOnly, adCmdText

Verwijderd

Topicstarter
mmm, het was toch niet goed, ik kreeg niet de laatste berichten op basis van datum, ik heb de order clause ook in de union selects moeten stoppen, toen werkte het wel..pff
Pagina: 1