Avatar billede no_doubt Nybegynder
09. marts 2009 - 22:59 Der er 19 kommentarer og
1 løsning

max to dage gamle

Hvordan ser en sql ud som kun trækker poster som er oprettet indenfor de sidste 2 dage

værdien den skal regne ud fra er now()
Avatar billede softspot Forsker
09. marts 2009 - 23:28 #1
SQL Server?

-- Find alle rækker i tabel, hvor oprettetdato + 2 dage er
-- større end den aktuelle dato (og tidspunkt)
SELECT *
FROM tabel
WHERE DATEADD(day, 2, oprettetdato) > getdate()

Samme metode kan bruges i Access, blot med en lidt anden syntaks:

SELECT *
FROM tabel
WHERE DATEADD("d", 2, oprettetdato) > now()
Avatar billede no_doubt Nybegynder
10. marts 2009 - 08:21 #2
Så melder den
sql = "SELECT * FROM soegninger WHERE DATEADD("d", 2, dato) > now() "

fejlen er markeret ved "d"
Avatar billede softspot Forsker
10. marts 2009 - 08:31 #3
Argh! Det er naturligvis apostroffer og ikke anførselstegn der skal benyttes - sorry!

sql = "SELECT * FROM soegninger WHERE DATEADD('d', 2, dato) > now() "
Avatar billede no_doubt Nybegynder
10. marts 2009 - 08:34 #4
Man kan bygge en tæller i, så den skriver ud for det svar den giver på den sql, hvor mange gange den finder netop det ord i databasen.
Avatar billede softspot Forsker
10. marts 2009 - 08:45 #5
Hvilket ord??

Du er nok nød til at være noget(!) mere specifik mht. hvilke datastrukturer du har og hvilke kriterier du vil have udtræk baseret på...

Umiddelbart lyder det som en kombination af count og group by, men hvad der skal grupperes på og tælles er meget uklart.
Avatar billede no_doubt Nybegynder
10. marts 2009 - 08:48 #6
det kan godt være det er noget loop i loop

jeg har et søgefelt, når jeg har søgt bliver det gemt, de sidste to dages søgeord bliver så vist, men ud for dem vil jeg gerne kunne se hvor mange hits der er på netop det søgeord
Avatar billede softspot Forsker
10. marts 2009 - 08:55 #7
Det kunne være noget i stil med dette:

SELECT sogetekst, COUNT(*) AS antal
FROM soegninger
WHERE DATEADD('d', 2, oprettetdato) > now()
GROUP by soegetekst

hvor du så aflæser antallet af gange en søgetekst er anvendt i kolonnen antal...
Avatar billede no_doubt Nybegynder
10. marts 2009 - 16:53 #8
Hmm den viser en for mange hver gang :S
Avatar billede no_doubt Nybegynder
10. marts 2009 - 16:58 #9
nej det er mig der vrøvler, den skal tjekker hvor mange gange det ord der er lagret i søgningerne går igen i en anden tabel...så er det ikke loop i loop, og i så fald hvordan
Avatar billede softspot Forsker
10. marts 2009 - 17:30 #10
Det kunne måske klares ved at lave en join mellem søgeordstabellen og den relaterede tabel (hvor søgeordet skal findes):

SELECT s.sogetekst, COUNT(*) AS antal
FROM soegninger AS s, anden_tabel t
WHERE DATEADD('d', 2, t.oprettetdato) > now()
AND t.tekst LIKE '%' + s.soegetekst + '%'
GROUP by s.soegetekst

"Anden_tabel" er så den tabel der skal optælles og det forventes at den har en kolonne som hedder "oprettetdato" (da jeg forventer at det så er rækker i anden_tabel der ikke må være ældre end 2 dage). Desuden forventer jeg at kolonnen der skal søges i, i "anden_tabel" hedder "tekst".

Det er utestet, så der gives på ingen måder nogen garanti for at det fungerer, men indtil videre vil jeg mene det fungerer :-)
Avatar billede no_doubt Nybegynder
10. marts 2009 - 17:52 #11
I soegninger er der:
soegeord
dato

I den anden er

skal den kigge efter soegeordet i tre kolonner og antallet af gange ordet optræder skal så udskrives
Avatar billede softspot Forsker
10. marts 2009 - 18:11 #12
du fik vist ikke kolonnerne i "den anden" tabel med :-)
Avatar billede no_doubt Nybegynder
10. marts 2009 - 18:17 #13
i den anden er tre tabeller som den skal kigge efter søgeordet i og så tælle op hvor mange gange de optræder
Avatar billede softspot Forsker
10. marts 2009 - 20:45 #14
Hvis der rent faktisk skal tælles hvormange gange et ord optræder i et eller flere felter i en anden tabel, så har du nok ret i at der skal en løkke (eller to) til, for det tror jeg ikke umiddelbart man kan direkte i SQL-sætningen... men du kan i det mindste begrænse udtrækket til kun at returnere de rækker, hvor ordet forekommer mindst én gang, hvilket i de fleste tilfælde burde være bedre end det fulde resultat...

Det kunne være noget med:

SELECT s.sogetekst, t.*
FROM soegninger AS s, anden_tabel t
WHERE DATEADD('d', 2, t.oprettetdato) > now()
AND (
  t.kolonne1 LIKE '%' + s.soegetekst + '%'
  OR t.kolonne2 LIKE '%' + s.soegetekst + '%'
  OR t.kolonne3 LIKE '%' + s.soegetekst + '%'
)
ORDER BY s.soegetekst


Der sorteres efter søgeordet, så du kan gennemløb rækkerne i resultatet og samle op på antallet af forekomster af hvert søgeord, uden at skulle lave de store armbevægelser i forhold til identificering af "søgeordstælleren"...

Det er dog stadig ikke en helt triviel opgave at lave optællingen, da du skal holde styr på hvilket søgeord du er igang med at tælle, undersøge antallet af forkomster i hver af de tre kolonner der skal undersøges og naturligvis iterere igennem alle rækkerne i resultatet.
Avatar billede no_doubt Nybegynder
11. marts 2009 - 17:55 #15
Jeg er altså lidt forvirret, hvad skal jeg gøre ? :S
Avatar billede softspot Forsker
16. marts 2009 - 23:14 #16
Jeg er ked af at jeg ikke har fået svaret, men jeg har været noget ophængt med andre projekter, så dit spørgsmål har lige fået lavere prioritet...

Det jeg mener er at du med min SQL får et udtræk, hvor alle data skulle være med, så det drejer sig blot om at gennemløbe resultatet i en løkke og så ellers holde styr på hvilke søgeord det skal tælles op for. Det er her jeg foreslår at du laver en liste hvor hvert søgeord har en plads og hvor du for hver række i dit udtræk optæller det antal gange et søgeord findes i rækkens felter. Du vil så efter resultatet er gennemløbet, kunne aflæse antallet af gange et søgeord findes i listen. Du kunne bruge et Dictionary-objekt hvor søgeordet er nøglen og værdien er antallet af gange det findes.

Noget i stil med dette:

[b]function taelAntalForekomster(soegKilde, soegEfter)
  dim antal
  antal = 0
  ' TODO: lav noget kode der kan tælle  hvormange
  '      gange soegEfter forekommer i soegKilde
  taelAntalForekomster = antal
end function

' Opret en liste til optælling af forekomster af hver søgetekst
set liste = Server.CreateObject("Scripting.Dictionary")

' TODO: Opsæt den sql der skal fremsøge data
set rs = conn.Execute(sql)
do while not rs.eof
  soegetekst = rs("soegetekst")
  ' hvis søgeteksten ikke er blevet optalt tidligere,
  ' så skal der oprettes en plads i listen til optællinger
  ' på denne søgetekst...
  if not liste.Exists(soegetekst) then
    call liste.Add(soegetekst,0)
  end if
  liste.item(soegetekst) = liste.item(soegetekst) _
              + taelAntalForekomster(rs("kolonne1"),soegetekst)
  liste.item(soegetekst) = liste.item(soegetekst) _
              + taelAntalForekomster(rs("kolonne2"),soegetekst)
  liste.item(soegetekst) = liste.item(soegetekst) _
              + taelAntalForekomster(rs("kolonne3"),soegetekst)
  rs.movenext
loop
rs.close
set rs = nothing

' Udskriv antallet af gange hvert søgeord er fundet
for each k in liste.keys
  Response.Write k & " => " & liste.item(k) & "<br>"
next[/b}
Avatar billede softspot Forsker
16. marts 2009 - 23:47 #17
Hæh! Se lige bort fra de der BB-tags (som ikke følger den gængse standard ;-)) - altså i starten og slutningen af kodeeksemplet (dvs. [b] og [/b})
Avatar billede no_doubt Nybegynder
09. december 2009 - 15:54 #18
ligger i nogle svar ?
Avatar billede softspot Forsker
09. december 2009 - 16:30 #19
Vær så god! :-)
Avatar billede softspot Forsker
09. december 2009 - 16:44 #20
Tak for point :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester