Avatar billede razser Nybegynder
29. maj 2005 - 15:47 Der 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...?
Avatar billede nielle Nybegynder
29. maj 2005 - 15:59 #1
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) & "%'
Avatar billede razser Nybegynder
29. maj 2005 - 16:37 #2
Jeg har prøvet dette, men det virker tilsyneladenede ikke hvis jeg sætte flere betingelser på...? Meget underligt....

Hvis jeg blot skriver WHERE PageActive=true virker denne betingelse;

Hvis jeg så skriver WHERE AllowSearch=true virker denne betingelse;

Men hvis jeg skriver WHERE PageActive=true AND AllowSearch=true virker kun den første betingelse??
Avatar billede nielle Nybegynder
29. maj 2005 - 16:57 #3
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.
Avatar billede razser Nybegynder
29. maj 2005 - 17:09 #4
hmm, så skriver den at: "Der er en syntaksfejl i JOIN-handlingen.".....

Men det må vel svare til at skrive: Page.PageActive=true etc.....?

(lige nu springer den dog alle betingelser over ????)
Avatar billede nielle Nybegynder
29. maj 2005 - 17:19 #5
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.
Avatar billede razser Nybegynder
29. maj 2005 - 17:22 #6
lige nu søger den på alt, også selv om jeg skriver: WHERE PageActive=true
og en side i databasen er sat til false....??
Avatar billede nielle Nybegynder
29. maj 2005 - 17:25 #7
Kan du ikke lige poste hele din nuværende SQL-sætning.
Avatar billede razser Nybegynder
29. maj 2005 - 17:29 #8
StrSQL = "SELECT DISTINCT Paragraph.ParagraphPageID, Page.PageParentPageID, Page.PageMenuText, Page.PageTitle, Page.PageDescription, Page.PageCreatedDate, Page.PageUpdatedDate, Page.PageActive, Page.PageAllowsearch, Page.PageActiveFrom, Page.PageActiveTo, Page.PageAreaID, Page.URL FROM Page RIGHT JOIN Paragraph ON Page.PageID = Paragraph.ParagraphPageID WHERE Page.PageActive = true AND Page.PageAllowsearch = true AND Page.PageActiveFrom <= #" & FormatDateTime(Now) & "# AND Page.PageActiveTo >= #" & FormatDateTime(Now) & "#  AND ParagraphText Like '%" & ArraySTR(0) & "%' OR ParagraphHeader Like '%" & ArraySTR(0) & "%' "
Avatar billede nielle Nybegynder
29. maj 2005 - 17:53 #9
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) & "%'"
Avatar billede razser Nybegynder
29. maj 2005 - 18:02 #10
Søgeresultatet er det samme. Der opstår ingen fejl, men betingelserne tilgodeses ikke. Meget mystisk....
Avatar billede razser Nybegynder
29. maj 2005 - 18:09 #11
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.....?
Avatar billede razser Nybegynder
29. maj 2005 - 18:16 #12
...har løst det nu med lidt copy-paste.... ;)
Avatar billede razser Nybegynder
29. maj 2005 - 18:22 #13
Smid er svar så deler vi - er det ok?
Avatar billede nielle Nybegynder
29. maj 2005 - 18:23 #14
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)
Avatar billede nielle Nybegynder
29. maj 2005 - 18:23 #15
Ok, med mig. Du bestemmer helt selv fordelingen. :^)
Avatar billede nielle Nybegynder
29. maj 2005 - 18:30 #16
Udtrykket:

BetingelseA AND BetingelseB AND BetingelseC OR BetingelseD

- bliver opfattet som:

(BetingelseA AND BetingelseB AND BetingelseC) OR BetingelseD
Avatar billede razser Nybegynder
29. maj 2005 - 18:36 #17
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.....
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
Kurser inden for grundlæggende programmering

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