[ASP] 'Ingewikkelde' query: is dit mogelijk?

Pagina: 1
Acties:

  • Knakker
  • Registratie: April 2000
  • Laatst online: 06-09 19:10
Ik heb een Access database, met daarin een aantal kolommen. Eén van die kolommen heet "Opendagen", als in: de open dagen die een school heeft.

Een voorbeeld van een entry is:
"24-04-2002, 25-04-2002, 02-05-2002, 03-05-2002"

Het is dus een tekstveld waarin een aantal data in de notatie dd-mm-jjjj staan, gescheiden door een komma.

Nu wil ik een query construeren, waarbij ik alleen díe scholen uit de database haal waarvan er nog tenminste 1 open dag is. Nu is het 1 mei 2002, dus de onder andere school met de bovenstaande open dagen moet als resultaat uit de query komen. Een database-entry met als Opendagen "23-03-2002, 24-03-2002" zou logischerwijs niet naar voren komen als resultaat.


Probleem:
Volgens mij is wat ik wil, niet mogelijk met een SQL query.


Als het nou één datum was, had ik hem in een kolom met data-type "datum" gestopt en dan had ik redelijk eenvoudig een query kunnen construeren. Ik kan dit alsnog wel doen (5-6 kolommen construeren met open dagen data), maar wat nou als de klant 25 open dagen in wil voeren? M.a.w.: Ik kan _in beginsel_ niet een eindig aantal data kolommen in de database gaan invoeren; het moet gewoon in één veld.

Ik ben al wel bezig met een andere aanpak: de tijdsbestek-kwestie (vallen open dagen voor of na de huidige datum?) buiten beschouwing laten, en dan vervolgens de query resultaten gaan filteren. Maar volgens mij is dat gigantisch veel werk (of is er een soort van datumvergelijk functie in ASP?)...

Vandaar de vraag: Is wat ik wil tóch mogelijk in een SQL query, of moet ik het idd via een andere manier doen? En als ik het via een andere manier moet doen, is de manier die ik beschrijf dan de beste of heb je een beter idee?

Alvast bedankt.

Geef mij maar een Warsteiner.


  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 07-07 11:51
Op woensdag 01 mei 2002 19:37 schreef Knakker het volgende:
Vandaar de vraag: Is wat ik wil tóch mogelijk in een SQL query, of moet ik het idd via een andere manier doen? En als ik het via een andere manier moet doen, is de manier die ik beschrijf dan de beste of heb je een beter idee?

Alvast bedankt.
De beste manier is om een extra tabel met open dagen te maken en die te linken aan de scholen. Op die manier kan je voor een school zo veel open dagen opslaan als je wilt, en heel eenvoudig een query maken die scholen met nog komende open dagen weergeeft.

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Verwijderd

oplossing is een extra tabel 'opendagen' met deze structuur:
OPENDAG_ID (niet uniek, maar per school dus)
OPENDAG_DATUM

in de oorspronkelijke tabel zet je de OPENDAG_ID

en met een SELECT * FROM opendagen WHERE OPENDAG_ID='$id'
trek je de datums eruit.

  • Knakker
  • Registratie: April 2000
  • Laatst online: 06-09 19:10
Hmm, nu komen we op een punt wat ik nooit begrepen heb (shame on me :) ); dat linken van de ene tabel aan de andere, hoe zit dat precies (of heb je link waar dat uitgelegd wordt)?


De 'enige' interactie die ik in al mijn projecten gehad heb tussen tabellen was ik dat ik bijvoorbeeld 2 tabellen had, namelijk "Groepen" en "Items". Elk Item behoorde aan een groep, en in de tabel Items was alleen een kolom "groep" waarin een nummer stond die overeenkwam met de 'primaire sleutel' van de tabel groepen. Ik had dus altijd 2 queries: 1 die de tabel "Items" verwerkte, en 1 die alle groep-eigenschappen opzocht in tabel "Groepen". Wat is het wezenlijke verschil tussen 'linken' en wat ik altijd deed?

Geef mij maar een Warsteiner.


  • Knakker
  • Registratie: April 2000
  • Laatst online: 06-09 19:10
Op woensdag 01 mei 2002 19:45 schreef peidor het volgende:
oplossing is een extra tabel 'opendagen' met deze structuur:
OPENDAG_ID (niet uniek, maar per school dus)
OPENDAG_DATUM

in de oorspronkelijke tabel zet je de OPENDAG_ID

en met een SELECT * FROM opendagen WHERE OPENDAG_ID='$id'
trek je de datums eruit.
Die data kan ik toch ook gewoon rechtstreeks uit de tabel halen door "SELECT Opendagen FROM Scholen WHERE Id = " & id, dus ik zie geen verschil: of begrijp ik je nu verkeerd?

Het gaat mij er dus om, dat ik SQL data kan laten vergelijken terwijl die data niet in specifieke data-kolommen staat, maar in een tekstkolom.

Geef mij maar een Warsteiner.


Verwijderd

Op woensdag 01 mei 2002 19:52 schreef Knakker het volgende:

[..]

Die data kan ik toch ook gewoon rechtstreeks uit de tabel halen door "SELECT Opendagen FROM Scholen WHERE Id = " & id, dus ik zie geen verschil: of begrijp ik je nu verkeerd?

Het gaat mij er dus om, dat ik SQL data kan laten vergelijken terwijl die data niet in specifieke data-kolommen staat, maar in een tekstkolom.
dan heb je nog geen datums :)

Verwijderd

Op woensdag 01 mei 2002 19:49 schreef Knakker het volgende:
Hmm, nu komen we op een punt wat ik nooit begrepen heb (shame on me :) ); dat linken van de ene tabel aan de andere, hoe zit dat precies (of heb je link waar dat uitgelegd wordt)?


De 'enige' interactie die ik in al mijn projecten gehad heb tussen tabellen was ik dat ik bijvoorbeeld 2 tabellen had, namelijk "Groepen" en "Items". Elk Item behoorde aan een groep, en in de tabel Items was alleen een kolom "groep" waarin een nummer stond die overeenkwam met de 'primaire sleutel' van de tabel groepen. Ik had dus altijd 2 queries: 1 die de tabel "Items" verwerkte, en 1 die alle groep-eigenschappen opzocht in tabel "Groepen". Wat is het wezenlijke verschil tussen 'linken' en wat ik altijd deed?
verschil is dat je nu de 1:n relatie omdraait
was:
n: vele items in 1 groep (je 'hoofd'-table)
1: groep ('hulp'-tabel)

nu:
n: datums van opendagen ('hulp'-tabel)
1: anderen school gegevens ('hoofd'-tabel)

  • Knakker
  • Registratie: April 2000
  • Laatst online: 06-09 19:10
Dat begrijp ik, maar ... ik kan met deze omgedraaide verhouding toch nog steeds geen SQL query uitvoeren (ditmaal op de open_dagen tabel) die netjes allemaal IDs uitspuwt van scholen die wel overeenkomen?

Sorry als ik dom overkom :) maar ik zie het verband even niet. Zou je een kort voorbeeld kunnen geven?

Geef mij maar een Warsteiner.


Verwijderd

Op woensdag 01 mei 2002 20:25 schreef Knakker het volgende:
Dat begrijp ik, maar ... ik kan met deze omgedraaide verhouding toch nog steeds geen SQL query uitvoeren (ditmaal op de open_dagen tabel) die netjes allemaal IDs uitspuwt van scholen die wel overeenkomen?
OK, stap voor stap:
je vraagt de info op van een bepaalde school.
de school heeft een opendag_id en daarmee vraag je de opendag datums op van die betreffende school.

Dus ipv het lijstje wat je nu in 1 veld gestopt hebt, vraag je het lijstje nu mbv de opendag_id op uit de tabel
'opendag'.

Andersom kan natuurlijk ook: op een willekeurige dag waargeven welke scholen een opendag hebben.
Dan doe je een select op de datum(range), deze levert id's die weer matchen met de scholen.
Sorry als ik dom overkom :) maar ik zie het verband even niet. Zou je een kort voorbeeld kunnen geven?
Query van laatste voorbeeld kan er als volgt uitzien:
code:
1
2
SELECT * FROM Scholen, Opendag 
WHERE Scholen.opendag_id=Opendag.OPENDAG_ID AND Opendag.OPENDAG_DATUM='10-05-2002'

Verwijderd

ik vind er weinig handigs aan om slechts 1 opendag aan een school te kunnen hangen...

Verwijderd

Op donderdag 02 mei 2002 00:47 schreef fladder het volgende:
ik vind er weinig handigs aan om slechts 1 opendag aan een school te kunnen hangen...
Waar zie jij die beperking?
In de tabel 'opendag' moeten de opendag_id's juist niet uniek zijn. En ook de datums niet uniek...
Misschien is een unieke waarde toevoegen nog wel handig (ivm deleten etc), het kan iig geen kwaad. Dan krijg je dus dit:

tabel 'opendag'
ID
OPENDAG_ID (of bv SCHOOL_ID)
OPENDAG_DATUM

  • Knakker
  • Registratie: April 2000
  • Laatst online: 06-09 19:10
Ah...ik denk dat ik het begrijp. Ik ga zometeen beginnen met de uitwerking - I'll keep you updated ;)

Geef mij maar een Warsteiner.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20:58

Janoz

Moderator Devschuur®

!litemod

Het is duidelijker om ipv opendag_id de naam school_id te gebruiken aangezien dit de betekenis beter weergeeft :)

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


  • Knakker
  • Registratie: April 2000
  • Laatst online: 06-09 19:10
w00t het werkt :) Bedankt!

Ik heb nu wel een redelijk stukkie code, maar het is 100% SQL, dus ach...

Ik heb nu nog één enkel klein vraagje: is er in ASP ook een functie om het totaal aantal query resultaten te zien (zoals in php 'mysql_num_rows')? Dit natuurlijk omdat de code anders SQL queries gaat construeren die 'WHERE ()' bevatten, en dat geeft uiteraard een foutmelding.


Misschien kan ik nog mensen blij maken met de code, dus ik post em hier maar...Optimalisaties natuurlijk altijd welkom (voor het geval iemand zich verveeld ofzo :P )
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  // We hebben nu een array met query-resultaten van scholen die voldoen aan
  // alle criteria behalve het tijdsbereik. We lopen ze nu 1 voor 1 langs om te
  // bepalen welke scholen open dagen hebben binnen het tijdsbestek. 
  
  // We stellen nu éérst de huidige datum vast, in database-vorm (mm-dd-yyyy)
  HuidigeDatum = DatePart("M",Date) & "-" & DatePart("D", Date) & "-" & DatePart("YYYY", Date)
  
  // En we stellen nu de einddatum vast
  If DatePart("M", Date) + Request("periode") > 12 Then
    // Er zijn nou eenmaal niet meer dan 12 maanden
    MaandNr = DatePart("M", Date) + Request("periode") - 12
    EindDatum = MaandNr & "-" & DatePart("D", Date) & "-" & DatePart("YYYY", Date) + 1  
  Else
    EindDatum = DatePart("M", Date) + Request("periode") & "-" & DatePart("D", Date) & "-" & DatePart("YYYY", Date)
  End If
  
  SQL = "SELECT ID_School FROM Opendagen WHERE ("

  While NOT QR.Eof
    If EersteGeweest = True Then SQL = SQL & " OR "
    SQL = SQL & "((ID_School = " & QR("Id") & ") AND (Datum >= #" & HuidigeDatum & "#) AND (Datum < #" & EindDatum & "#))"
    EersteGeweest = True
    QR.MoveNext
  Wend
  SQL = SQL & ");"
  
  Set QR = Con.Execute(SQL)

  // Als het goed is hebben we nu de ID nummers van alle scholen die voldoen
  // aan ALLE criteria. We lopen ze nog 1x langs om de rest van de schoolgegevens
  // ook te krijgen en voeren die aan de sub scherm_toon_zoekresultaten.
  
  EersteGeweest = False

  SQL = "SELECT * FROM Scholen WHERE ("
  While NOT QR.EOF
    If EersteGeweest = True Then SQL = SQL & " OR "  
    SQL = SQL & "(ID = " & QR("ID_School") & ")"
    EersteGeweest = True   
    QR.MoveNext
  Wend
  SQL = SQL & ") ORDER BY Schoolnaam ASC, Plaats ASC;"
  
  Set QR = Con.Execute(SQL)

  Call scherm_toon_zoekresultaten (QR)

Geef mij maar een Warsteiner.

Pagina: 1