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 dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.