Avatar billede falslev Nybegynder
01. september 2004 - 13:14 Der er 10 kommentarer og
1 løsning

Hjælp til søgning i 3 felter

På min side har jeg et søge felt hvor man kan skrive op til 3 ord som der så søges på.
Der søges i 3 felter: Brand, ItemType og ItemColor.

SQL'en idag ser ud som nedenstående men det dræber jo fuldstændig min servers cpu.

Søger derfor hjælp til hvordan man gør dette.

SQL'en:
SQLstmt = "SELECT * FROM varer WHERE ((Brand LIKE '%" & SearchString1 & "%' AND Brand LIKE '%" & SearchString2 & "%' AND ItemType LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (Brand LIKE '%" & SearchString1 & "%' AND ItemType LIKE '%" & SearchString2 & "%' AND Brand LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (ItemType LIKE '%" & SearchString1 & "%' AND Brand LIKE '%" & SearchString2 & "%' AND Brand LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (Brand LIKE '%" & SearchString1 & "%' AND Brand LIKE '%" & SearchString2 & "%' AND ItemColor LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (ItemColor LIKE '%" & SearchString1 & "%' AND Brand LIKE '%" & SearchString2 & "%' AND Brand LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (Brand LIKE '%" & SearchString1 & "%' AND ItemType LIKE '%" & SearchString2 & "%' AND ItemColor LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (ItemColor LIKE '%" & SearchString1 & "%' AND Brand LIKE '%" & SearchString2 & "%' AND ItemType LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (ItemType LIKE '%" & SearchString1 & "%' AND ItemColor LIKE '%" & SearchString2 & "%' AND Brand LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (Brand LIKE '%" & SearchString1 & "%' AND Brand LIKE '%" & SearchString2 & "%' AND Brand LIKE '%" & SearchString3 & "%')) "
SQLstmt = SQLstmt & "AND Isearch=" & ID & " AND SOLD=0;"
Avatar billede fennec Nybegynder
01. september 2004 - 13:26 #1
Måske du skulle kikke lidt på MATCH funktionen i MySQL

http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html
http://dev.mysql.com/doc/mysql/en/Fulltext_Boolean.html

Det bliver noget i denne retning:
"select * from DinTabel where MATCH (Brand,ItemType,ItemColor) AGAINST ('enTekst')"
Avatar billede Slettet bruger
01. september 2004 - 13:26 #2
Kan UNION måske bruges?

F.eks.:
SELECT * FROM varer
WHERE (Brand LIKE '%" & SearchString1 & "%'
  OR Brand LIKE '%" & SearchString2 & "%'
  OR Brand LIKE '%" & SearchString3 & "%')
AND Isearch=" & ID & " AND SOLD=0
UNION
SELECT * FROM varer
WHERE (ItemType LIKE '%" & SearchString1 & "%'
  OR ItemType LIKE '%" & SearchString2 & "%'
  OR ItemType LIKE '%" & SearchString3 & "%')
AND Isearch=" & ID & " AND SOLD=0
UNION
SELECT * FROM varer
WHERE (ItemColor LIKE '%" & SearchString1 & "%'
  OR ItemColor LIKE '%" & SearchString2 & "%'
  OR ItemColor LIKE '%" & SearchString3 & "%')
AND Isearch=" & ID & " AND SOLD=0



SQLstmt = SQLstmt & "OR (Brand LIKE '%" & SearchString1 & "%' AND ItemType LIKE '%" & SearchString2 & "%' AND Brand LIKE '%" & SearchString3 & "%') "
SQLstmt = SQLstmt & "OR (ItemType LIKE '%" & SearchString1 & "%' AND Brand LIKE '%" & SearchString2 & "%' AND Brand LIKE '%" & SearchString3
Avatar billede arne_v Ekspert
01. september 2004 - 13:27 #3
LIKE '%noget%' er helt generelt en meget heftig konstruktion, så hvis
du vil lave den slags søgning, så koster det.

MySQL har en fulltext funktionalitet som du måske kan kigge på som alternativ.
Avatar billede fennec Nybegynder
01. september 2004 - 13:30 #4
Jeg er ikke sikker på hvordan den opfører sig med flere søgeord som måske/måske ikke er der. Bruger altid Boolean metoden når der er flere ord, så jeg ville samle dine SearchString til en linje som kan bruges i en Boolean MATCH.
Avatar billede falslev Nybegynder
01. september 2004 - 13:41 #5
Med eks. på Fulltext_Boolean kan den godt finde dele af ord?

Eks. hvis teksten er stole og der søges på sto?
Avatar billede fennec Nybegynder
01. september 2004 - 14:00 #6
Det burde den...
Avatar billede falslev Nybegynder
01. september 2004 - 14:30 #7
Kan sgu ikke for det til at virke.
Kan du hjælpe mig med et eks.?
Avatar billede fennec Nybegynder
01. september 2004 - 14:38 #8
Det handler om at få samlet dine SearchString's til en. Nu ved jeg ikke hvilket sprog du bruger, men det ser sådan ud i ASP

<%
MatchString = ""
if trim(SearchString1) <> "" then
  MatchString = MatchString & "+"& SearchString1 & " "
end if
if trim(SearchString2) <> "" then
  MatchString = MatchString & "+"& SearchString2 & " "
end if
if trim(SearchString3) <> "" then
  MatchString = MatchString & "+"& SearchString3 & " "
end if
SQLstmt = "SELECT * FROM varer WHERE MATCH (Brand,ItemType,ItemColor) AGAINST ('"& MatchString &"' IN BOOLEAN MODE)"
Avatar billede falslev Nybegynder
01. september 2004 - 15:28 #9
Det virker ganske perfekt. Er dog i tvivl om hvor cpu venlig den er :)
Men lav et svar og du får point.
Avatar billede falslev Nybegynder
01. september 2004 - 15:31 #10
Skal der sættes index op på Brand,ItemType,ItemColor?
Avatar billede fennec Nybegynder
01. september 2004 - 15:45 #11
Jeg tvivler på det vil hjælpe, da du søger inde i teksten på kolonnerne. Index hjælper primært på sortering samt præcis valg (Brand='EtEllerAndet') da den så allerede har records sorteret.
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
Computerworld tilbyder specialiserede kurser i database-management

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