04. september 2005 - 13:29Der 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")
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").
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.
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.
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"
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å.
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
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 & ";"
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 & ";"
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
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.