Avatar billede axkris Nybegynder
16. september 2003 - 16:27 Der er 24 kommentarer og
1 løsning

Ineffektiv sql-sætning

Hej

På min hårdbelastede forside har jeg en sql-forespørgsel, som ikke er særlig effektiv. Den tager alt for meget data ind, som jeg senere skal sorte fra. Så derfor jeg meget gerne have en effektiv sql-forespørgsel.

Koden er:

strQuery="SELECT onlineforum, url_id, linkType, url_undergruppe, artikeltype, link_samle, url_link, hovedpost_samle, datopublish, grafik, overskrift, url_description FROM search WHERE datopublish is not Null ORDER BY datopublish DESC, link_samle DESC"
Set SearchDB=Server.CreateObject("ADODB.Connection")
SearchDB.Open ("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=" + Server.MapPath("/db/selvet.mdb"))
Set SearchRS=SearchDB.Execute(strQuery)

Dim TMP
TMP=Cint(TMP)
TMP=0

While Not SearchRS.EOF
    strMedtag="JA"

    IF left(SearchRS("artikeltype"),7)<>"artikel" or left(SearchRS("url_undergruppe"),7) = "bøger" or left(SearchRS("url_undergruppe"),7) = "musik" THEN
        strMedtag="NEJ"
    END IF

    IF CDate(Now) < CDate(SearchRS("datopublish")) THEN
    strMedtag="NEJ"
    END IF

    IF strMedtag="JA" THEN

        IF TMP<14 THEN
       
        .
        .
        .
        .
        .

Krav:

1) Brug kun de 14 artikler, hvis "datopublish" er lig med i dag eller ældre.
2) "artikeltype" skal have værdien "artikel"
3) "url_undergruppe" må ikke have værdien "bøger"
4) "url_undergruppe" må ikke have værdien "musik"

De artikler som får stemplet - strMedtag="JA" - vises, og resten bruges ikke. Og det er jo spild af go computerkraft.

Kom glad :-) Hvis der er en, som kommer noget helt genialt sql-sætning, som sætter jeg gerne pointene op på 200 :-)
Avatar billede terry Ekspert
16. september 2003 - 19:37 #1
I have a feeling everyone is waiting until you setthe points up to 200 :o)

Not quite sure what you mean with
1)Brug kun de 14 artikler, hvis "datopublish" er lig med i dag eller ældre.

But if we take the last three

strQuery="SELECT onlineforum, url_id, linkType, url_undergruppe, artikeltype, link_samle, url_link, hovedpost_samle, datopublish, grafik, overskrift, url_description FROM search WHERE artikeltype = 'artikel' AND url_undergruppe <> 'bøger' AND url_undergruppe <> 'musik' AND datopublish is not Null ORDER BY datopublish DESC, link_samle DESC"

Or something like that
Avatar billede axkris Nybegynder
16. september 2003 - 19:42 #2
Det, som jeg mener (og det som du mangler at indbygge i forespørgslen) er:

IF CDate(Now) < CDate(SearchRS("datopublish")) THEN
    strMedtag="NEJ"
    END IF

    IF strMedtag="JA" THEN

        IF TMP<14 THEN

Der er tale om at forespørgslen skal tage artiklerne fra i dag, i går, i fårgårs osv. indtil, at den fundet 14 artikler. Alle andre artikler er irrelevante.
Avatar billede terry Ekspert
16. september 2003 - 19:46 #3
strQuery="SELECT TOP 14 onlineforum, url_id, linkType, url_undergruppe, artikeltype, link_samle, url_link, hovedpost_samle, datopublish, grafik, overskrift, url_description FROM search WHERE artikeltype = 'artikel' AND url_undergruppe <> 'bøger' AND url_undergruppe <> 'musik' AND datopublish < Now() AND datopublish is not Null ORDER BY datopublish DESC, link_samle DESC"
Avatar billede terry Ekspert
16. september 2003 - 19:47 #4
NOTE: This is NOT tested, also TOP 14 CAN return more than 14 records IF a number of records have teh same value
Avatar billede axkris Nybegynder
16. september 2003 - 19:52 #5
Det er ikke dem, som skal tages, men:

IF CDate(Now) < CDate(SearchRS("datopublish")) THEN

Det skal være de 14, som har en datopublish-værdi, som er lig med (eller ældre end) dags dato... f.eks:

160903
160903
160903
150903
140903
140903
140903
140903
140903
130903
100903
100903
050903
030903
Avatar billede terry Ekspert
16. september 2003 - 19:58 #6
I cant see what the SQL returns so I would know what "ikke dem" is ;o)
Avatar billede axkris Nybegynder
16. september 2003 - 20:01 #7
Listen over artikler er lang:

.
.
.
250903
250903
250903
240903
230903
200903
______Vis kun starter_____
160903
160903
160903
150903
140903
140903
140903
140903
140903
130903
100903
100903
050903
030903
______Vis kun stopper_____
020903
020903
010903
010903
010903
.
.
.

Jeg har i hundredvis af artikler i database, men den skal kun vise disse 14 artikler :-)
Avatar billede axkris Nybegynder
16. september 2003 - 20:04 #8
F.eks. noget ala:

strQuery="SELECT Count 14 " & CDate(Now) => CDate(SearchRS("datopublish")) & " onlineforum, url_id, linkType, url_undergruppe, artikeltype, link_samle, url_link, hovedpost_samle, datopublish, grafik, overskrift, url_description FROM search WHERE artikeltype = 'artikel' AND url_undergruppe <> 'bøger' AND url_undergruppe <> 'musik' AND datopublish < Now() AND datopublish is not Null ORDER BY datopublish DESC, link_samle DESC"
Avatar billede terry Ekspert
16. september 2003 - 20:11 #9
axkris>What does "______Vis kun stopper_____" and starter mean?
Avatar billede axkris Nybegynder
16. september 2003 - 20:13 #10
:-)

______Vis kun starter_____ = ______ show only starts here _____

______Vis kun slutter _____ = ______ show only ends here _____
Avatar billede terry Ekspert
16. september 2003 - 20:29 #11
I cant see what the SQL returns so I would know what "ikke dem" is!!!!!!!

WHAT DOES THE SQL RETURN?
Avatar billede axkris Nybegynder
16. september 2003 - 20:33 #12
Sql'en retunerer artiklerne fra "250903" til "010903", men det er kun de 14 artikler, altså 160903... 030903, som er relevante.
Avatar billede terry Ekspert
16. september 2003 - 20:41 #13
Can you send the db to eksperten@santhell.dk and I will take a look? Compact and zipped please
Avatar billede axkris Nybegynder
16. september 2003 - 20:44 #14
Sendt :-)

Hvis det kan hjælpe dig lidt, så mangler du blot at "indbygge" følgende funktionalitet i sql-sætning:

counter = 0

do while CDate(Now) => CDate(SearchRS("datopublish")) and counter < 15
  'denne artikel skal vises
  counter = counter + 1
  SearchRS.moveNext
loop
Avatar billede terry Ekspert
16. september 2003 - 21:22 #15
I dont know what you have sent me but NONE have an article type = 'artikel' so HOW the SQL I gave works I dont know!

Do you mean LIKE 'artikel*' ?

and what about  url_undergruppe <> 'bøger' AND url_undergruppe <> 'musik' ??

do you mean they must NOT contain these words?

axkris>I am packing in for the night, JUST finding out what you want has used your 60 points :o)
Avatar billede axkris Nybegynder
16. september 2003 - 22:23 #16
>NONE have an article type = 'artikel'
sorry... det skulle have været 'artikel_web"

>do you mean they must NOT contain these words?
yes
Avatar billede terry Ekspert
17. september 2003 - 18:22 #17
SELECT TOP 14 search.onlineforum, search.url_id, search.linkType, search.url_undergruppe, search.artikeltype, search.link_samle, search.url_link, search.hovedpost_samle, search.datopublish, search.grafik, search.overskrift, search.url_description
FROM search
WHERE (((search.url_undergruppe)<>'bøger' And (search.url_undergruppe)<>'musik') AND ((search.artikeltype)='artikel_web') AND ((search.datopublish)<=Date()))
ORDER BY search.datopublish DESC , search.link_samle DESC;
Avatar billede terry Ekspert
17. september 2003 - 18:22 #18
Kom glad :-) Hvis der er en, som kommer noget helt genialt sql-sætning, som sætter jeg gerne pointene op på 200 :-)
Avatar billede terry Ekspert
17. september 2003 - 21:03 #19
axkris>do you have any comments?
Avatar billede hittman Nybegynder
17. september 2003 - 22:30 #20
Tip:
Opbyg query'en i forespørgsels "Grid" et hvor du kan klikke din frem til resultatet. Sæt dine kriterier de rigtige steder - du kan også finde funktionen TOP under de ststiskiske funktioner.
Når du nærmer dig det rigtige resultat - konverter til SQL koden i forespørgslen - og lav de ændringer som TERRY har forslået.
200 point til TERRY - hans kode virker !
(Har arbejdet med SQL i mange år og det ser fornuftigt ud)
Avatar billede axkris Nybegynder
18. september 2003 - 08:47 #21
Super det virker :-)

Men hvorfor kan jeg også få følgende til at virke:
strQuery="SELECT TOP 7 search.url_id, search.linkType, search.url_undergruppe, search.artikeltype, search.link_samle, search.url_link, search.hovedpost_samle, search.datopublish, search.grafik, search.overskrift, search.url_description FROM search WHERE (((search.url_undergruppe)='bøger' AND ((search.artikeltype)='artikel_web') AND ((search.datopublish)<=Date())) ORDER BY search.datopublish DESC, search.link_samle DESC"

Artikel-forespørgslen (som du optimerede) virker, men min egen bog-forespørgsel virker ikke - den laver en timeout.

Og fejlen ligger sikkert omkring...

(search.url_undergruppe)='bøger'

... da det er det eneste som jeg har ændret (ud over at jeg har slettet en and-sætning)
Avatar billede axkris Nybegynder
18. september 2003 - 08:48 #22
UPS ;)
Men hvorfor kan jeg også få følgende til at virke = Men hvorfor kan jeg IKKE også få følgende til at virke
Avatar billede axkris Nybegynder
18. september 2003 - 08:53 #23
Virker:
strQuery="SELECT TOP 7 search.url_id, search.linkType, search.url_undergruppe, search.artikeltype, search.link_samle, search.url_link, search.hovedpost_samle, search.datopublish, search.grafik, search.overskrift, search.url_description FROM search WHERE (((search.url_undergruppe)='bøger' And (search.url_undergruppe)<>'musik') AND ((search.artikeltype)='artikel_web') AND ((search.datopublish)<=Date())) ORDER BY search.datopublish DESC, search.link_samle DESC"

Virker IKKE:
strQuery="SELECT TOP 7 search.url_id, search.linkType, search.url_undergruppe, search.artikeltype, search.link_samle, search.url_link, search.hovedpost_samle, search.datopublish, search.grafik, search.overskrift, search.url_description FROM search WHERE (((search.url_undergruppe)='bøger' AND ((search.artikeltype)='artikel_web') AND ((search.datopublish)<=Date())) ORDER BY search.datopublish DESC, search.link_samle DESC"
Avatar billede axkris Nybegynder
18. september 2003 - 08:58 #24
Sorry, jeg glemte en ")" i "(((search.url_undergruppe)='bøger'"

Det virker nu... mange tak for hjælpen :-)

200 points til dig :-)
Avatar billede terry Ekspert
18. september 2003 - 19:15 #25
mange tak :o)
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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