16. september 2003 - 16:27Der 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 :-)
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"
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.
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"
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;
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)
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)
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"
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.