29. maj 2005 - 15:47Der er
15 kommentarer og 2 løsninger
Problem med WHERE i SELECT DISTINCT-sætning
Jeg har lavet en søgefunktion, der søger i en database, hvor der i én tabel er sider, og i en anden tabel er afsnittene til siderne. Her bruger jeg:
StrSQL = StrSQL = "SELECT DISTINCT bl.a. bl.a. bl.a. FROM Page RIGHT JOIN bl.a. bl.a. bl.a. WHERE ParagraphText Like '%" & ArraySTR(0) & "%' OR ParagraphHeader Like '%" & ArraySTR(0) & "%'
Hvis jeg gerne vil stille nogle betingelser før den går over at søge i afsnit-tabellen, hvor kan jeg så placere en WHERE-sætning?
F.eks. skal den kun søge på sider, der er aktive.
F.eks. SELECT DISTINCT ... FROM Page WHERE PageActive=true ... RIGHT JOIN... ???
Hvordan skrives WHERE foran RIGHT JOIN? - hvis man kan...?
Der er ingen grund til at skrive dem foran RIGHT JOIN. Dine betngelser på Page-tabellem skrives på samme sted som resten af dine betingelser:
StrSQL = "SELECT DISTINCT bl.a. bl.a. bl.a. FROM Page RIGHT JOIN bl.a. bl.a. bl.a. WHERE PageActive=true AND ParagraphText Like '%" & ArraySTR(0) & "%' OR ParagraphHeader Like '%" & ArraySTR(0) & "%'
Hvis du nu sætter et alias på for dine tabeller kan det også skrives:
StrSQL = "SELECT DISTINCT bl.a. bl.a. bl.a. FROM Page AS P RIGHT JOIN bl.a. bl.a. bl.a. WHERE P.PageActive=true AND ParagraphText Like '%" & ArraySTR(0) & "%' OR ParagraphHeader Like '%" & ArraySTR(0) & "%'
Aliaser skal bruges hvis du har et felt som hedder det samme i hver af tabellerne. På den måde kan du udpege præcist hvilket felt i hvilken tabel det drejer sig om.
Korrekt fotolket, men et alias er en mere kompakt form.
Hvad mener du med "(lige nu springer den dog alle betingelser over ????)"? Hvis der er en syntaksfejl så springer den ikke noget over - så bliver den bare slet ikke udført.
Hmmm, umiddelbart ser syntaksen ud til at være i orden
Prøv at lave en testudskrift af din SQL før at du udføre den. Det hænder tit at denne slags fejl skyndes at SQL-strengen indeholder noget andet end man forventede. Post gerne resultatet her.
Din SQL udsat for Alias:
"SELECT DISTINCT P2.ParagraphPageID, P1.PageParentPageID, P1.PageMenuText, P1.PageTitle, P1.PageDescription, P1.PageCreatedDate, P1.PageUpdatedDate, P1.PageActive, P1.PageAllowsearch, P1.PageActiveFrom, P1.PageActiveTo, P1.PageAreaID, P1.URL FROM Page AS P1 RIGHT JOIN Paragraph AS P2 ON P1.PageID = P2.ParagraphPageID WHERE P1.PageActive = true AND P1.PageAllowsearch = true AND P1.PageActiveFrom <= #" & FormatDateTime(Now) & "# AND P1.PageActiveTo >= #" & FormatDateTime(Now) & "# AND P2.ParagraphText LIKE '%" & ArraySTR(0) & "%' OR P2.ParagraphHeader LIKE '%" & ArraySTR(0) & "%'"
Jeg tror at jeg har fundet problemet: hvis jeg fjerner:
OR ParagraphHeader Like '%" & ArraySTR(0) & "%'
...så virker det. Dvs. man kan ikke sætte betingelser op der skal gælde efter OR ?? Jeg vil nu gerne have, at man skal kunne søge i både teksten og i overskriften, så hvordan mon det gøres smartest.....?
Det store spørgsmål når man blander AND og OR er "i hvilken rækkefølge sammensættes de?". Som regel bør man hjælpe på vej med et par strategisk placered parenteser. Der er nemlig stor forskel på:
(BetingelseA AND BetingelseB AND BetingelseC) OR BetingelseD BetingelseA AND BetingelseB AND (BetingelseC OR BetingelseD)
Mit næste spørgsmål (som jeg opretter til 100 point om få sec.) går på, hvordan jeg kan foretage søgninger i 2 tabeller. Jeg har prøvet med UNION ALL, men den vælger kun den sidstnævnte??? Begge tabeller har jeg tænkt mig skulle være ens mht. opbygning/feltnavne.....
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.