17. juni 2002 - 20:35Der er
17 kommentarer og 2 løsninger
forsk. opførsel lokal & remote
Jeg har en asp side med en søgefunktion på en mssql7 database. Søgefunktionen er opbygget sådan at når folk søger på flere ord, SKAL dataen indeholde alle ord. Problemet er at det virker fint lokalt, men hos udbyderen (tiscali) virker det som om den ignorer AND funktionen. Min forspørgsel ser således ud:
SELECT navn, by1, adresse, postnr, tlf, email, website, beskrivelse1, beskrivelse, egen_side, kategori FROM ba WHERE (navn like '%dette%' AND navn like '%er%') OR (by1 like '%dette%' AND by1 like '%er%') OR (adresse like '%dette%' AND adresse like '%er%') OR (postnr like '%dette%' AND postnr like '%er%') OR (tlf like '%dette%' AND tlf like '%er%') OR (email like '%dette%' AND email like '%er%') OR (website like '%dette%' AND website like '%er%') OR (beskrivelse1 like '%dette%' AND beskrivelse1 like '%er%') OR (beskrivelse like '%dette%' AND beskrivelse like '%er%') OR (kategori like '%dette%' AND kategori like '%er%') ORDER BY navn;
kroger>Sorry! I now understand what your trying to do and it SHOULD WORK! I would try simplifying the SELECT to just a single WHERE ((postnr like '%dette%' AND postnr like '%er%') top see if you can get that to work and then build on it from there! I have SQL Server 2000 and it DOES work here an dI cant see why it shouldnt work with 7.0
Also make sure you DO have data to return from the SELECT :o)
The funny thing is that i have tried to run it locally and remote, and checked both request to the server, and they are exactly matched, and with the same data in the db, but as stated before they act differently...
Jeg har aldrig set en forskel på 2 servere, der gør at så fundamentale ting i SQL syntaksen skulle opføre sig forskelligt (og jeg har altså efterhånden set en del servere :-)
Hvordan ser din simplificerede SQL ud ?
P.S. Når du nu får ovenstående til at virke, vil det køre super langsomt, hvis der er ret mange data. LIKE er den langsomste måde at søge på overhovedet. Du bør overveje at kigge på full-text indexing.
Okay, jeg fandt årsagen til fejlen, som er en opbygningsfejl. Som den er nu, vil den reagere som ønsket hvis de to ord ligger i samme række, men ikke hvis de ligger i hver sin. Eks.: Søger på ole bent.
Den vil finde det hvis der er en med navnet "ole bent", men ikke hvis navnet er ole og adressen er "bent iversvej".
Dette er jo lidt en tænkefejl fra min side. Nu er spørgsmålet så: hvordan skal jeg lave kaldet for at få det til at virke på sidste eksempel(ole der bor på bent iversvej)?
Jeg vil igen henlede opmærksomheden på full-text indexing, for alt andet bliver kun work-arounds som ikke holder i længden, hvis din løsning skal være bare en smule skalerbar.
En måde at implementere din søgning uden full-text, kunne være
SELECT * FROM ba WHERE navn + adresse LIKE '%ole%bent%'
Dette kræver dog, at du er 100% sikker på i hvilken rækkefølge du vil søge, da den ikke vil virke med eks.
SELECT * FROM ba WHERE adresse + navn LIKE '%ole%bent%'
Du kunne også opbygge en nærmest uendelig AND-OR konstruktion med LIKE i din WHERE clause, men den vil være total uoverskuelig fra dag 1, for slet ikke at snakke om at vedligeholde.
Derudover vil du med en sådan anvendelse af LIKE, ikke kunne forvente svartider idag (overdrivelse fremmer som bekendt forståelsen :-)
hmm. jeg vil kigge lidt på full text indexing. MEn lige et spørgsmål til: er det ikke dumt at vælge alle kolonner i en tabel frem for at kun vælge dem ud man skal bruge (nu vi er ved perfomance ting)?
Du bør naturligvis kun vælge de felter du skal bruge (og de poster du skal bruge), men jeg antog at du kunne abstrahere fra dette i mit eksempel, der gik på WHERE clausen. Jeg så ingen grund til at skrive alle dine felter :)
Min netforbindelse har desværre været nede nogle dage, jeg beklager...
Jeg har omstruktureret det lidt og valgt en anden løsning, men fordi i gad hjælpe kan i jo lige splitte pointene, så hvis du terry gider og poste et svar, kan dig og tmceu dele pointene
Hope your net connection is stable now, and thanks :o)
Synes godt om
Ny brugerNybegynder
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.