Avatar billede tblaster Nybegynder
04. september 2005 - 13:29 Der er 16 kommentarer og
1 løsning

Sql streng skal samle information fra 2 tabeller

Hejsa ...

Jeg har brug for lidt hjælp til min sql streng:

Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D LEFT JOIN stemmerxip S ON D.ID = S.ID Where (S.ID IS NULL or S.IP <>'" & Request.ServerVariables("REMOTE_ADDR") & "') and " & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID") & " LIMIT " & intStart & ", " & intPageSize & ";"

Strengen henter alle posterne ud, også selvom at der ligger en post i stemmerxip hvor brugerens ip er opfyldt. Men hvis det er for svært at gennemskue ovenstående så er det følgende sql jeg skal have udbygget:

Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D WHERE " & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID")  & " ORDER By " & Visning & " LIMIT " & intStart & ", " & intPageSize & ";"

Det sql strengen også skal opfylde, er at den kun skal hente poster ud hvor der ikke findes en post under stemmerxip, hvor D.ID = Stemmerxip.ID og at Stemmerxip.ip = Request.ServerVariables("REMOTE_ADDR")

På forhånd tak!
Avatar billede fennec Nybegynder
05. september 2005 - 08:11 #1
Hvordan ser din SQL streng ud, efter den er sammensat?? Bare skrive den ud på skærmen med "response.write sql" og smid linjen herind. Det kan nemlig være et problem med Session("SqlSoeg").
Avatar billede tblaster Nybegynder
05. september 2005 - 15:35 #2
Det bliver udskrevet som følgende:
Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D LEFT JOIN stemmerxip S ON D.ID = S.ID Where (S.ID IS NULL or S.IP <> 'xxx.xxx.xxx.xxx') and D.ParentID = 0 Or D.ParentID = 503 or D.ParentID = 514 or D.ParentID = 515 or D.ParentID = 516 Limit 0,25"

Mht. at du mener at det måske har noget med Session("SqlSoeg") at gøre så kan jeg fortælle at følgende fint virker:
Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D WHERE " & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID")  & " ORDER By " & Visning & " LIMIT " & intStart & ", " & intPageSize & ";"

Det er sådan set jo bare denne sql der skal udbygges som jeg nævner.
Avatar billede fennec Nybegynder
05. september 2005 - 15:39 #3
Det er lige netop Session("SqlSoeg") der er problemet fordi OR forekommer heri. Der skal en parentes omkring:

Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D LEFT JOIN stemmerxip S ON D.ID = S.ID Where (S.ID IS NULL or S.IP <>'" & Request.ServerVariables("REMOTE_ADDR") & "') and (" & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID") & ") LIMIT " & intStart & ", " & intPageSize & ";"
Avatar billede tblaster Nybegynder
05. september 2005 - 16:00 #4
Det havde jeg da lige glemt :-) Det er hermed rettet således at jeg får følgende ud:
SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D LEFT JOIN stemmerxip S ON D.ID = S.ID Where (S.ID IS NULL or S.IP <>'xxx.xxx.xxx.xxx') and (D.ParentID = 0  Or D.ParentID = 503 Or D.ParentID = 514 Or D.ParentID = 515 Or D.ParentID = 516) LIMIT 0, 25;

Men jeg får stadig får stadig poster ud hvor jeg ved der er stemt på fra den given ip.
Avatar billede fennec Nybegynder
05. september 2005 - 16:09 #5
Hvad så med dit join?? Joiner du på D.ID = S.ID?? Der ville jeg tro at en af dem skulle være en anden kolonne...
Avatar billede tblaster Nybegynder
05. september 2005 - 16:27 #6
Ved godt det var en dårlig måde at bygge det op på ... felt id'et (det unikke) hedder i Stemmerxip tabellen StemmerIp. Og der er overensstemmelse mellem S.ID og D.ID.

Desuden har jeg allerede følgende kørende sql script som til dels laver det sammen som det jeg skal have sqlen i denne post til:
Sql = "SELECT* from (SELECT D.Tekst, D.ID, D.Score/D.Stemmer as Point FROM Data D LEFT JOIN log S ON D.ID = S.DataID Where (S.DataID IS NULL or S.nr <>'" & RQ_nr & "') and LENGTH(D.Tekst) < " & MsgLength  &" and (D.ParentID = 0 " & Replace(FindIDer(13), "ParentID", "D.ParentID") & ") Order By RAND() Limit 50) as tmpTable order by Point desc"
Avatar billede tblaster Nybegynder
05. september 2005 - 18:04 #7
Jeg har lige prøvet at rette min sql fra:
Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D LEFT JOIN stemmerxip S ON D.ID = S.ID Where (S.ID IS NULL or S.IP <>'" & Request.ServerVariables("REMOTE_ADDR") & "') and (" & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID") & ") LIMIT " & intStart & ", " & intPageSize & ";"

Til:
Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D LEFT JOIN stemmerxip S ON D.ID = S.ID Where (S.ID IS NULL) and (" & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID") & ") LIMIT " & intStart & ", " & intPageSize & ";"

Altså fjerne delen med ip check og så virker min sql fint nok. Det der lader til at give problemer er altså delen med at den stadig skal trække poster ud hvor andre har stemt på men hvor man ikke selv har stemt på.
Avatar billede tblaster Nybegynder
05. september 2005 - 18:16 #8
Kan det være fordi mit ip felt er af følgende type:
varchar(15)

Og hvis, hvad skal jeg så rette det til for at få det til at virke?
Avatar billede tblaster Nybegynder
05. september 2005 - 18:51 #9
Er min bedste chance at benytte følgende, altså ændre den måde jeg lagre mine ip'er i databasen?
mysql> SELECT INET_ATON('209.207.224.40');
-> 3520061480

mysql> SELECT INET_NTOA(3520061480);
-> '209.207.224.40'
Avatar billede fennec Nybegynder
06. september 2005 - 08:09 #10
Det lader til at problemet ligger i dataerne. Er det en en til mange relation der er mellem D.ID = S.ID??
Avatar billede tblaster Nybegynder
06. september 2005 - 14:09 #11
Det findes kun en post i data hvor følgende følgende eks gælder:
D.ID = 50

Men der findes mange poster under StemmerXIp hvor følgnede gælder:
S.ID = 50

Men med de krav der stilles til StemmerXIp tabellen, eks:
S.ID = 50
S.StemmerXIp IS NULL Or S.IP = 'xxx.xxx.xxx.xx'

Så skulle der gerne kun være et eller ingen felter i StemmerXIp der opfylder det.

Håber det svarere på dit spørgsmål.
Avatar billede fennec Nybegynder
06. september 2005 - 14:25 #12
Jeps, det var hvad jeg regnede med :o)

Også vil du trække alle de poster fra "Data", hvor der ikke er en relation endnu (NULL) eller hvor brugerens IP ikke er med på stemmerxip listen??

Hvis det er tilfældet kan du ikke lave det med join. Der er nemlig kun 2 tilfælde hvor du får det rigtige resultat. Hvis der ingen relation er, eller der kun er EN relation.

Du skal til at bruge IN() metoden, men netop MySQL her lidt problemer med understøttelse af dette. SQL'en skal se sådan ud:

Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data where D.ID not in (select S.ID from stemmerxip S where S.IP <>'" & Request.ServerVariables("REMOTE_ADDR") & "') and (" & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID") & ") LIMIT " & intStart & ", " & intPageSize & ";"
Avatar billede tblaster Nybegynder
06. september 2005 - 16:29 #13
Du har forstået det rigtigt nu.

Med rettelsen til .. FROM Data D ... får jeg stadig poster ud der er stemt på fra den pågældende ip.
Avatar billede fennec Nybegynder
06. september 2005 - 16:36 #14
Min fejl :o)

Sql = "SELECT D.Id, D.ParentID, D.Navn, D.Stemmer, D.Score, D.Tekst, D.dato FROM Data D where D.ID not in (select S.ID from stemmerxip S where S.IP ='" & Request.ServerVariables("REMOTE_ADDR") & "') and (" & Replace(Session("SqlSoeg"), "ParentID", "D.ParentID") & ") LIMIT " & intStart & ", " & intPageSize & ";"
Avatar billede tblaster Nybegynder
06. september 2005 - 16:43 #15
Super! Så køre det. Takker mange gange for hjælpen, og smid endelig et svar!
Avatar billede fennec Nybegynder
06. september 2005 - 16:52 #16
.o) <-- One Eyed Jack
Avatar billede tblaster Nybegynder
24. november 2005 - 19:53 #17
Der er opstået en række problemer med sql udtrækket. Det viser sig at der er et par fejl i den. Har du overskud til at give en hånd?
http://www.eksperten.dk/spm/667199
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